สายไปที่เกมเล็กน้อย แต่เพื่อความสมบูรณ์ ...
แทนที่จะ 'รอ' เพื่อให้งานทั้งหมดเสร็จสิ้นคุณสามารถคิดในแง่ของหลักการฮอลลีวูดว่า "อย่าโทรหาฉันฉันจะโทรหาคุณ" - เมื่อฉันทำเสร็จแล้ว ฉันคิดว่ารหัสที่ได้จะดูดีกว่านี้ ...
Guava มีเครื่องมือที่น่าสนใจที่จะทำให้สำเร็จ
ตัวอย่าง ::
ตัด ExecutorService ลงใน ListeningExecutorService ::
ListeningExecutorService service = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(10));
ส่งคอลเลกชันของ callables เพื่อดำเนินการ ::
for (Callable<Integer> callable : callables) {
ListenableFuture<Integer> lf = service.submit(callable);
// listenableFutures is a collection
listenableFutures.add(lf)
});
ตอนนี้ส่วนสำคัญ:
ListenableFuture<List<Integer>> lf = Futures.successfulAsList(listenableFutures);
แนบการเรียกกลับไปยัง ListenableFuture ซึ่งคุณสามารถใช้เพื่อรับการแจ้งเตือนเมื่อฟิวเจอร์สทั้งหมดเสร็จสมบูรณ์ ::
Futures.addCallback(lf, new FutureCallback<List<Integer>>() {
@Override
public void onSuccess(List<Integer> result) {
log.info("@@ finished processing {} elements", Iterables.size(result));
// do something with all the results
}
@Override
public void onFailure(Throwable t) {
log.info("@@ failed because of :: {}", t);
}
});
นอกจากนี้ยังมีข้อได้เปรียบที่คุณสามารถรวบรวมผลลัพธ์ทั้งหมดในที่เดียวเมื่อการประมวลผลเสร็จสิ้น ...
ข้อมูลเพิ่มเติมที่นี่