Трохи запізнюємось на гру, але заради завершення ...
Замість того, щоб "чекати" завершення всіх завдань, ви можете думати з точки зору голлівудського принципу: "Не дзвоніть мені, я зателефоную вам" - коли я закінчу. Я думаю, що отриманий код є більш елегантним ...
Гуава пропонує кілька цікавих інструментів для цього.
Приклад ::
Оберніть службу 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);
}
});
Це також пропонує перевагу, що ви можете зібрати всі результати в одному місці, коли обробка закінчена ...
Більше інформації тут