게임에 약간 늦었지만 완료를 위해 ...
모든 작업이 완료되기를 '대기'하는 대신 할리우드 원칙에 따라 "나에게 전화하지 마십시오. 전화하겠습니다"라고 생각할 수 있습니다. 결과 코드가 더 우아하다고 생각합니다 ...
구아바는이를 달성하기위한 몇 가지 흥미로운 도구를 제공합니다.
예 ::
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);
}
});
또한 처리가 완료되면 모든 결과를 한곳에서 수집 할 수 있다는 이점도 제공합니다.
더 자세한 정보는 여기