Trochę późno do gry, ale ze względu na zakończenie ...
Zamiast „czekać” na zakończenie wszystkich zadań, możesz pomyśleć zgodnie z zasadą Hollywood: „nie dzwoń do mnie, zadzwonię” - kiedy skończę. Myślę, że wynikowy kod jest bardziej elegancki ...
Guava oferuje kilka interesujących narzędzi do osiągnięcia tego celu.
Przykład ::
Zawiń ExecutorService w ListeningExecutorService ::
ListeningExecutorService service = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(10));
Prześlij zbiór kallabów do wykonania:
for (Callable<Integer> callable : callables) {
ListenableFuture<Integer> lf = service.submit(callable);
// listenableFutures is a collection
listenableFutures.add(lf)
});
Teraz zasadnicza część:
ListenableFuture<List<Integer>> lf = Futures.successfulAsList(listenableFutures);
Załącz oddzwonienie do ListenableFuture, którego możesz użyć, aby otrzymywać powiadomienia o zakończeniu wszystkich kontraktów futures:
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);
}
});
Daje to również tę zaletę, że po zakończeniu przetwarzania można zebrać wszystkie wyniki w jednym miejscu ...
Więcej informacji tutaj