Một chút muộn để trò chơi nhưng để hoàn thành ...
Thay vì 'chờ đợi' để tất cả các nhiệm vụ hoàn thành, bạn có thể nghĩ theo nguyên tắc Hollywood, "đừng gọi cho tôi, tôi sẽ gọi cho bạn" - khi tôi kết thúc. Tôi nghĩ rằng mã kết quả là thanh lịch hơn ...
Quả ổi cung cấp một số công cụ thú vị để thực hiện điều này.
Một ví dụ ::
Kết hợp một ExecutorService vào ListeningExecutorService ::
ListeningExecutorService service = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(10));
Gửi một bộ sưu tập các cuộc gọi để thực hiện ::
for (Callable<Integer> callable : callables) {
ListenableFuture<Integer> lf = service.submit(callable);
// listenableFutures is a collection
listenableFutures.add(lf)
});
Bây giờ là phần thiết yếu:
ListenableFuture<List<Integer>> lf = Futures.successfulAsList(listenableFutures);
Đính kèm một cuộc gọi lại vào ListenableFuture, mà bạn có thể sử dụng để được thông báo khi tất cả các hợp đồng tương lai hoàn thành ::
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);
}
});
Điều này cũng mang lại lợi thế là bạn có thể thu thập tất cả các kết quả ở một nơi sau khi quá trình xử lý kết thúc ...
Thêm thông tin ở đây