【并发编程】CompletableFuture的complete方法介绍

Complete方法介绍

CompletableFuture 类中的 complete() 方法用于手动完成一个异步任务,并设置其结果。通过调用 complete() 方法,可以将一个特定的结果设置到 CompletableFuture 对象中,然后任何等待该异步任务的操作都会得到这个预先设置的结果。

源代码:

在这里插入图片描述

其中,TCompletableFuture 对象的泛型类型,表示异步任务的结果类型。参数 value 是设置给异步任务的结果。

注意:

  1. 一旦调用了 complete() 方法,CompletableFuture 对象的状态会立即变为已完成,而且之后任何对该对象的计算都不会再触发异步任务的执行。如果该对象已经处于完成状态,再次调用 complete() 方法不会有任何效果。
  2. 如果异步任务已经抛出了异常,调用 complete() 方法将不会有任何效果。此时,可以使用 completeExceptionally(Throwable ex) 方法手动设置异步任务的异常结果。
  3. 如果有多个线程同时尝试调用 complete() 方法,只有第一个成功的线程能够设置结果,其他线程的调用将被忽略。

示例:

public class TestCompletableFuture {
    public static void main(String[] args) {
        CompletableFuture<String> future = new CompletableFuture<>();
        System.out.println("1");
        // 启动一个新线程,模拟异步任务
        new Thread(() -> {
            try {
                // 模拟异步任务的耗时操作
                Thread.sleep(2000);
                // 手动完成异步任务并设置结果
                future.complete("Hello World");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }).start();
        System.out.println("2");
        // 等待异步任务的完成,并获取结果
        try {
            String result = future.get();
            System.out.println("异步任务的结果:" + result);
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        }
        System.out.println("3");
    }
}

输出:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eHR5Yoy2-1689847109447)(CompletableFuture笔记.photo/image-20230720175308140.png)]

其中:CompletableFuture 类中的 get() 方法用于等待异步任务的完成,并获取其结果。当调用 get() 方法时,如果异步任务已经完成,则该方法会立即返回异步任务的结果;如果异步任务尚未完成,则 get() 方法会阻塞当前线程,直到异步任务完成并返回结果。

另外get()方法还可用于设置超时时间:get(long timeout, TimeUnit unit)

timeout 参数表示超时时间的数量,unit 参数表示超时时间的时间单位。如果在指定的超时时间内异步任务完成了,则 get() 方法会立即返回异步任务的结果;如果超过了指定的超时时间,但异步任务仍未完成,则 get() 方法会抛出 TimeoutException 异常。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值