Немного поздно в игре, но для завершения ...
Вместо того, чтобы «ждать» завершения всех задач, вы можете думать в терминах голливудского принципа: не звоните мне, я позвоню вам - когда я закончу. Я думаю, что полученный код более элегантен ...
Guava предлагает несколько интересных инструментов для этого.
Пример:
Оберните 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) {
// do something with all the results
}
@Override
public void onFailure(Throwable t) {
// log failure
}
});
Это также дает то преимущество, что вы можете собрать все результаты в одном месте после завершения обработки ...
Дополнительную информацию см. здесь
person
Răzvan Petruescu
schedule
07.11.2014