Apa perbedaan antara CompletableFuture.get()dan CompletableFuture.join()?
Di bawah ini adalah kode saya:
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());
}
Saya telah mencoba dengan kedua metode tersebut tetapi saya tidak melihat perbedaan hasilnya.
get()mengharuskan Anda untuk menangkap pengecualian yang dicentang. Anda harus melihat perbedaan ketika Anda mengubah dariget()kejoin(), karena Anda Mulailah segera akan mendapatkan kesalahan kompilator mengatakan bahwa baikInterruptedExceptionatauExecutionExceptiondibuang ditryblok.