Un po 'in ritardo al gioco, ma per motivi di completamento ...
Invece di "aspettare" che tutti i compiti finiscano, puoi pensare in base al principio di Hollywood, "non chiamarmi, ti chiamerò" - quando avrò finito. Penso che il codice risultante sia più elegante ...
Guava offre alcuni strumenti interessanti per raggiungere questo obiettivo.
Un esempio ::
Avvolgere un ExecutorService in un ListeningExecutorService ::
ListeningExecutorService service = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(10));
Invia una raccolta di callable per l'esecuzione ::
for (Callable<Integer> callable : callables) {
ListenableFuture<Integer> lf = service.submit(callable);
// listenableFutures is a collection
listenableFutures.add(lf)
});
Ora la parte essenziale:
ListenableFuture<List<Integer>> lf = Futures.successfulAsList(listenableFutures);
Allega una richiamata a ListenableFuture, che puoi utilizzare per ricevere una notifica quando tutti i futures sono completi:
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);
}
});
Ciò offre anche il vantaggio di poter raccogliere tutti i risultati in un unico posto una volta terminata l'elaborazione ...
Maggiori informazioni qui