CompletableFuture allOf 方法
时间: 2024-12-25 07:23:24 浏览: 5
### Java `CompletableFuture.allOf` 方法详解
#### 1. 基本概念
`CompletableFuture.allOf` 是用于组合多个 `CompletableFuture` 实例的方法。该方法接收可变数量的 `CompletableFuture<?>... cfs` 参数并返回一个新的 `CompletableFuture<Void>`,当所有给定的 completable futures 都完成时它才会完成[^2]。
#### 2. 使用场景
此功能非常适合处理需要等待一组并发操作全部完成后才能继续的情况。通过这种方式可以有效地管理多个异步任务,并确保只有在所有任务都成功结束后才进行下一步逻辑。
#### 3. 示例代码
下面是一个简单的例子来展示如何使用 `allOf`:
```java
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
public class CompletableFutureExample {
public static void main(String[] args) throws InterruptedException, ExecutionException {
// 定义三个不同的异步任务
CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> {
try { Thread.sleep(1000); } catch (InterruptedException e) {}
return "Task 1";
});
CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> {
try { Thread.sleep(2000); } catch (InterruptedException e) {}
return "Task 2";
});
CompletableFuture<String> future3 = CompletableFuture.supplyAsync(() -> {
try { Thread.sleep(3000); } catch (InterruptedException e) {}
return "Task 3";
});
// 组合这些future对象到一个单一的任务中去
CompletableFuture<Void> combinedFuture = CompletableFuture.allOf(future1, future2, future3);
// 等待所有的任务完成
combinedFuture.join();
// 获取各个任务的结果
System.out.println(future1.get());
System.out.println(future2.get());
System.out.println(future3.get());
// 输出总耗时
long startTime = System.currentTimeMillis();
combinedFuture.join(); // 这里再次调用join()只是为了演示目的,在实际应用中通常不需要这样做。
long endTime = System.currentTimeMillis();
System.out.printf("Total time taken: %d ms\n", (endTime - startTime));
}
}
```
在这个例子中,定义了三个不同延迟时间的任务,并利用 `CompletableFuture.allOf()` 将它们组合起来。程序会一直等到这三个任务都完成了之后再打印各自的结果以及整个过程所花费的时间。注意这里为了简化说明,直接用了 `Thread.sleep()` 来模拟长时间运行的操作;而在真实的应用环境中应当替换为具体的业务逻辑实现。
阅读全文