Oyuna biraz geç ama tamamlanma uğruna ...
Tüm görevlerin bitmesini 'beklemek' yerine, Hollywood prensibi, "beni arama, seni arayacağım" - bitirdiğim zaman düşünebilirsiniz. Bence ortaya çıkan kod daha zarif ...
Guava bunu başarmak için bazı ilginç araçlar sunuyor.
Bir örnek ::
Bir ExecutorService öğesini ListeningExecutorService ::
ListeningExecutorService service = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(10));
Yürütmek için bir callables koleksiyonu gönderin ::
for (Callable<Integer> callable : callables) {
ListenableFuture<Integer> lf = service.submit(callable);
// listenableFutures is a collection
listenableFutures.add(lf)
});
Şimdi önemli olan:
ListenableFuture<List<Integer>> lf = Futures.successfulAsList(listenableFutures);
Tüm futures tamamlandığında bilgilendirilmek için kullanabileceğiniz ListenableFuture'a bir geri arama ekleyin:
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);
}
});
Bu, işlem bittikten sonra tüm sonuçları tek bir yerde toplayabilme avantajı sunar ...
Daha fazla bilgi burada