CompletableFuture中join与get的区别

        CompletableFuture 是 Java 8 引入的一个类,用于支持异步编程和函数式编程。它允许你编写非阻塞的代码,并且可以链式调用多个异步操作。get() 和 join() 方法都是用来获取         CompletableFuture 的结果,但它们在行为上有一些关键的区别。

get()

  1. 阻塞:get() 方法会阻塞当前线程,直到 CompletableFuture 完成(即任务完成或异常抛出)。
  2. 异常处理:如果 CompletableFuture 中的任务抛出了异常,get() 会将该异常封装成 ExecutionException 或 CancellationException 抛出。因此,在调用 get() 时通常需要捕获这些异常。
  3. 超时控制:get() 还有一个重载版本,接受一个超时参数(long timeout, TimeUnit unit),可以在指定时间内等待结果,如果超过时间还没有结果,则抛出 TimeoutException。

示例:

CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> "Hello, World!");
try {
    String result = future.get(); // 阻塞直到结果可用
    System.out.println(result);
} catch (InterruptedException | ExecutionException e) {
    e.printStackTrace();
}

join()

  1. 阻塞:join() 方法也会阻塞当前线程,直到 CompletableFuture 完成。
  2. 异常处理:与 get() 不同,如果 CompletableFuture 中的任务抛出了异常,join() 会直接抛出原始异常,而不是将其封装成 ExecutionException。
  3. 简洁性:join() 提供了更简洁的语法,不需要捕获额外的异常类型,适合于不关心具体异常类型的场景。


示例:

CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> "Hello, World!");
try {
    String result = future.join(); // 阻塞直到结果可用
    System.out.println(result);
} catch (CompletionException e) { // 可以捕获原始异常
    e.getCause().printStackTrace();
}

总结


        使用 get() 时需要注意处理 InterruptedException 和 ExecutionException。如果需要对异常进行更细粒度的控制,比如区分执行异常和取消异常,或者需要设置超时,那么应该使用 get()。

        如果希望代码更简洁,并且不介意直接处理原始异常,那么 join() 是一个更好的选择。
在实际开发中,根据需求选择合适的方法。如果想简单地获取结果而不关心具体的异常类型,join() 通常更为方便。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值