Complete方法介绍
CompletableFuture
类中的 complete()
方法用于手动完成一个异步任务,并设置其结果。通过调用 complete()
方法,可以将一个特定的结果设置到 CompletableFuture
对象中,然后任何等待该异步任务的操作都会得到这个预先设置的结果。
源代码:
其中,T
是 CompletableFuture
对象的泛型类型,表示异步任务的结果类型。参数 value
是设置给异步任务的结果。
注意:
- 一旦调用了
complete()
方法,CompletableFuture
对象的状态会立即变为已完成,而且之后任何对该对象的计算都不会再触发异步任务的执行。如果该对象已经处于完成状态,再次调用complete()
方法不会有任何效果。 - 如果异步任务已经抛出了异常,调用
complete()
方法将不会有任何效果。此时,可以使用completeExceptionally(Throwable ex)
方法手动设置异步任务的异常结果。 - 如果有多个线程同时尝试调用
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");
}
}
输出:
其中:CompletableFuture
类中的 get()
方法用于等待异步任务的完成,并获取其结果。当调用 get()
方法时,如果异步任务已经完成,则该方法会立即返回异步任务的结果;如果异步任务尚未完成,则 get()
方法会阻塞当前线程,直到异步任务完成并返回结果。
另外get()
方法还可用于设置超时时间:get(long timeout, TimeUnit unit)
。
timeout
参数表示超时时间的数量,unit
参数表示超时时间的时间单位。如果在指定的超时时间内异步任务完成了,则 get()
方法会立即返回异步任务的结果;如果超过了指定的超时时间,但异步任务仍未完成,则 get()
方法会抛出 TimeoutException
异常。