Was ist der Unterschied zwischen CompletableFuture.get()
und CompletableFuture.join()
?
Unten ist mein Code:
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());
}
Ich habe es mit beiden Methoden versucht, aber ich sehe keinen Unterschied im Ergebnis.
get()
erfordert, dass Sie geprüfte Ausnahmen abfangen. Sie sollten den Unterschied bemerken, wenn Sie vonget()
nach wechselnjoin()
, da Sie sofort einen Compilerfehler erhalten, der besagt, dass wederInterruptedException
nochExecutionException
in dentry
Block geworfen werden .