CompletableFuture 的 allOf 方法
时间: 2024-12-25 16:23:22 浏览: 3
### CompletableFuture.allOf 方法详解
#### 方法签名与返回值
`CompletableFuture.allOf(CompletableFuture<?>... cfs)` 接受可变数量的 `CompletableFuture` 对象作为参数,并返回一个新的 `CompletableFuture<Void>` 实例。此实例会在所有给定的 `CompletableFuture` 完成后完成。
#### 行为解释
一旦调用了 `allOf()` 并传入若干个 `CompletableFuture`,它会创建一个新的 `CompletableFuture<Void>` 来表示这些输入 completable futures 的组合状态。只有当所有的输入 completable futures 都已完成(无论是正常完成还是异常终止),由 `allOf()` 返回的那个 completable future 才会被标记为完成[^1]。
需要注意的是,即使其中一个或多个 completable futures 抛出了未捕获的异常,只要其他 completable futures 继续执行直到结束,则整个集合仍然被认为完成了;但是,在这种情况下尝试访问结果可能会触发异常传播。
#### 使用示例
下面是一个简单的例子来展示如何使用 `CompletableFuture.allOf`:
```java
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
public class AllOfExample {
public static void main(String[] args) throws ExecutionException, InterruptedException {
// 创建三个异步任务
CompletableFuture<String> task1 = CompletableFuture.supplyAsync(() -> "Task 1");
CompletableFuture<Integer> task2 = CompletableFuture.supplyAsync(() -> 42);
CompletableFuture<Double> task3 = CompletableFuture.supplyAsync(() -> Math.random());
// 将它们放入 allOf 中
CompletableFuture<Void> combinedFuture = CompletableFuture.allOf(task1, task2, task3);
// 等待所有任务完成
combinedFuture.join();
// 获取各个任务的结果
String result1 = task1.get();
Integer result2 = task2.get();
Double result3 = task3.get();
System.out.printf("Results are %s, %d and %.2f%n", result1, result2, result3);
}
}
```
在这个例子中,程序通过 `supplyAsync` 启动了三个不同的异步计算任务,并利用 `allOf` 方法确保这三个任务都完成后才继续向下执行。最后分别从各自的 completable futures 取得具体的结果并打印出来[^2]。
阅读全文