Un peu tard pour le jeu mais pour finir ...
Au lieu d '«attendre» que toutes les tâches soient terminées, vous pouvez penser en termes du principe hollywoodien «ne m'appelez pas, je vous appellerai» - quand j'ai fini. Je pense que le code résultant est plus élégant ...
La goyave propose des outils intéressants pour y parvenir.
Un exemple ::
Enveloppez un ExecutorService dans un ListeningExecutorService ::
ListeningExecutorService service = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(10));
Soumettre une collection de callables pour exécution ::
for (Callable<Integer> callable : callables) {
ListenableFuture<Integer> lf = service.submit(callable);
// listenableFutures is a collection
listenableFutures.add(lf)
});
Maintenant l'essentiel:
ListenableFuture<List<Integer>> lf = Futures.successfulAsList(listenableFutures);
Attachez un rappel à ListenableFuture, que vous pouvez utiliser pour être averti lorsque tous les futurs se terminent:
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);
}
});
Cela offre également l'avantage que vous pouvez collecter tous les résultats en un seul endroit une fois le traitement terminé ...
Plus d'informations ici