Arasındaki fark nedir CompletableFuture.get()
ve CompletableFuture.join()
?
Kodum aşağıdadır:
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());
}
Her iki yöntemle de denedim ama sonuçta bir fark görmüyorum.
get()
kontrol edilen istisnaları yakalamanızı gerektirir. Eğer değiştirmek zaman fark olmalıdırget()
içinjoin()
size imediately ne olduğunu söyleyen bir derleyici hatası alırsınız olarak,InterruptedException
ne deExecutionException
atılmış olantry
bloğun.