Немного опоздал к игре, но ради завершения ...
Вместо того, чтобы «ждать» выполнения всех заданий, вы можете думать с точки зрения голливудского принципа «не звони мне, я позвоню тебе» - когда я закончу.
Я думаю, что полученный код более элегантный ...
Гуава предлагает несколько интересных инструментов для достижения этой цели.
Пример ::
Обернуть ExecutorService в ListeningExecutorService ::
ListeningExecutorService service = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(10));
Представить коллекцию вызываемых для исполнения ::
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);
}
});
Это также дает то преимущество, что вы можете собрать все результаты в одном месте после завершения обработки ...
Подробнее здесь