Agak terlambat untuk pertandingan tapi demi penyelesaian ...
Alih-alih 'menunggu' untuk menyelesaikan semua tugas, Anda dapat berpikir dalam hal prinsip Hollywood, "jangan panggil aku, aku akan memanggilmu" - ketika aku selesai. Saya pikir kode yang dihasilkan lebih elegan ...
Jambu biji menawarkan beberapa alat yang menarik untuk mencapai hal ini.
Sebuah contoh ::
Bungkus ExecutorService ke dalam ListeningExecutorService ::
ListeningExecutorService service = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(10));
Kirim koleksi perlengkapan untuk eksekusi ::
for (Callable<Integer> callable : callables) {
ListenableFuture<Integer> lf = service.submit(callable);
// listenableFutures is a collection
listenableFutures.add(lf)
});
Sekarang bagian penting:
ListenableFuture<List<Integer>> lf = Futures.successfulAsList(listenableFutures);
Lampirkan panggilan balik ke ListenableFuture, yang dapat Anda gunakan untuk diberi tahu ketika semua masa depan selesai ::
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);
}
});
Ini juga menawarkan keuntungan bahwa Anda dapat mengumpulkan semua hasil di satu tempat setelah pemrosesan selesai ...
Informasi lebih lanjut di sini