CompletableFuture < T > class: join() vs get()

CompletableFuture<T>类的 get()join()方法有什么不同?

下面是我的代码:

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());
}

这两种方法我都试过了,但结果没有什么不同。

79086 次浏览

唯一的区别是方法如何抛出异常。 get()Future接口中声明为:

V get() throws InterruptedException, ExecutionException;

这两个异常都是 检查过了异常,这意味着它们需要在您的代码中处理。正如您在代码中看到的,IDE 中的一个自动代码生成器要求代表您创建 try-catch 块。

try {
CompletableFuture.allOf(fanoutRequestList).get()
} catch (InterruptedException | ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

join()方法不引发 检查过了异常。

public T join()

而是抛出 不受约束 CompletionException。因此,您不需要 try-catch 块,而是可以在使用讨论过的 List<String> process函数时充分利用 exceptionally()方法

CompletableFuture<List<String>> cf = CompletableFuture
.supplyAsync(this::process)
.exceptionally(this::getFallbackListOfStrings) // Here you can catch e.g. {@code join}'s CompletionException
.thenAccept(this::processFurther);

您可以找到 get()join()实现 给你

除了 Dawid 提供的答案之外,get 方法还有两种形式:

get()
get(Long timeout, TimeUnit timeUnit)

第二个 走开以等待时间作为参数,最多等待提供的等待时间。

try {
System.out.println(cf.get(1000, TimeUnit.MILLISECONDS));
} catch (InterruptedException | ExecutionException | TimeoutException ex) {
ex.printStackTrace();
}

您可以参考 这份文件了解更多信息。

  1. Join ()是在 CompletableFuture 中定义的,而 get ()来自于 interface Future
  2. Join ()引发未检查异常,而 get ()引发检查异常
  3. 您可以中断 get () ,然后抛出一个 InterruptedException
  4. Get ()方法允许指定最大等待时间