【并发编程】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 异常。

猜你喜欢

转载自blog.csdn.net/AwesomeP/article/details/131836647