Sự khác biệt giữa CompletableFuture.get()
và là CompletableFuture.join()
gì?
Dưới đây là mã của tôi:
List<String> process() {
List<String> messages = Arrays.asList("Msg1", "Msg2", "Msg3", "Msg4", "Msg5", "Msg6", "Msg7", "Msg8", "Msg9",
"Msg10", "Msg11", "Msg12");
MessageService messageService = new MessageService();
ExecutorService executor = Executors.newFixedThreadPool(4);
List<String> mapResult = new ArrayList<>();
CompletableFuture<?>[] fanoutRequestList = new CompletableFuture[messages.size()];
int count = 0;
for (String msg : messages) {
CompletableFuture<?> future = CompletableFuture
.supplyAsync(() -> messageService.sendNotification(msg), executor).exceptionally(ex -> "Error")
.thenAccept(mapResult::add);
fanoutRequestList[count++] = future;
}
try {
CompletableFuture.allOf(fanoutRequestList).get();
//CompletableFuture.allOf(fanoutRequestList).join();
} catch (InterruptedException | ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return mapResult.stream().filter(s -> !s.equalsIgnoreCase("Error")).collect(Collectors.toList());
}
Tôi đã thử với cả hai phương pháp nhưng tôi không thấy sự khác biệt về kết quả.
get()
yêu cầu bạn bắt các ngoại lệ đã kiểm tra. Bạn sẽ nhận thấy sự khác biệt khi bạn thay đổi từget()
sangjoin()
, vì ngay lập tức bạn sẽ nhận được lỗi trình biên dịch nói rằng không cóInterruptedException
hoặc khôngExecutionException
được ném vàotry
khối.