【异步编程】CompletableFuture的complete/get方法介绍

complete()方法用于手动完成CompletableFuture对象的异步任务,设置其结果。一旦调用,任务状态变已完成,后续计算不再触发任务执行。如果已完成或抛出异常,再次调用无效果,可使用completeExceptionally()设置异常结果。get()方法用于等待并获取任务结果,支持超时设置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 异常。

Get方法介绍

CompletableFuture 的 get 方法用于等待 CompletableFuture 计算完成并获取其结果。该方法会阻塞调用线程,直到 CompletableFuture 完成或者当前线程被中断。

CompletableFuture 类有两个 get 方法:

  • get():无限期地等待 CompletableFuture 完成并返回结果。
  • get(long timeout, TimeUnit unit):等待指定的时间,如果在超时时间内 CompletableFuture 仍未完成,则抛出 TimeoutException。

方法签名:

public T get() throws InterruptedException, ExecutionException
public T get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException

返回值: CompletableFuture 计算的结果。

异常:

  • InterruptedException:如果当前线程在等待过程中被中断。
  • ExecutionException:如果计算抛出了异常。
  • TimeoutException:如果在指定的时间内没有完成(仅适用于带超时的 get 方法)。

示例:

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;

public class CompletableFutureGetExample {
    public static void main(String[] args) {
        // 创建一个异步任务
        CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
            try {
                // 模拟耗时操作,睡眠 2 秒
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return "Hello, World!";
        });

        // 使用 get() 方法等待结果
        try {
            String result = future.get();
            System.out.println("Result: " + result);
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        }
    }
}
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class CompletableFutureGetWithTimeoutExample {
    public static void main(String[] args) {
        // 创建一个异步任务
        CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
            try {
                // 模拟耗时操作,睡眠 2 秒
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return "Hello, World!";
        });

        // 使用 get(long timeout, TimeUnit unit) 方法等待结果
        try {
            String result = future.get(1, TimeUnit.SECONDS);
            System.out.println("Result: " + result);
        } catch (InterruptedException | ExecutionException | TimeoutException e) {
            if (e instanceof TimeoutException) {
                System.out.println("Task timed out");
            } else {
                e.printStackTrace();
            }
        }
    }
    // 这段代码使用 get(long timeout, TimeUnit unit) 方法等待 CompletableFuture 完成,最多等待 1 秒。如果任务在 1 秒内没有完成,将抛出 TimeoutException。由于任务需要 2 秒才能完成,所以这段代码会输出 "Task timed out"。
}

CompletableFuture 的 get 方法是等待异步任务完成并获取结果的常用方法。get() 方法会无限期地等待,而 get(long timeout, TimeUnit unit) 方法允许你设置一个超时时间。如果在超时时间内任务没有完成,将抛出 TimeoutException。这两个方法都可能抛出 InterruptedException 和 ExecutionException,因此需要在代码中处理这些异常。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值