CompletableFuture.allOf()使用方法
CompletableFuture.allOf
是Java 8中CompletableFuture
类的一个静态方法,它允许你等待多个CompletableFuture
全部完成。下面我将详细介绍如何使用它。
基本用法
CompletableFuture<Void> allOf = CompletableFuture.allOf(future1, future2, future3);
allOf
方法接受一个CompletableFuture
数组或可变参数,返回一个新的CompletableFuture
,当所有给定的CompletableFuture
都完成时,这个新的CompletableFuture
也会完成。
完整示例
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
public class AllOfExample {
public static void main(String[] args) {
// 创建多个CompletableFuture
CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "结果1";
});
CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> "结果2");
CompletableFuture<String> future3 = CompletableFuture.supplyAsync(() -> {
try {
Thread.sleep(1500);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "结果3";
});
// 使用allOf等待所有future完成
CompletableFuture<Void> allFutures = CompletableFuture.allOf(future1, future2, future3);
try {
// 阻塞直到所有future完成
allFutures.get();
// 现在可以安全地获取各个future的结果
System.out.println(future1.get()); // 输出: 结果1
System.out.println(future2.get()); // 输出: 结果2
System.out.println(future3.get()); // 输出: 结果3
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
}
获取所有结果
allOf
本身不提供结果聚合,它只是等待所有future完成。如果你想收集所有结果,可以这样做:
CompletableFuture<List<String>> allResults = CompletableFuture.allOf(future1, future2, future3)
.thenApply(v -> {
return Stream.of(future1, future2, future3)
.map(CompletableFuture::join)
.collect(Collectors.toList());
});
List<String> results = allResults.get(); // ["结果1", "结果2", "结果3"]
异常处理
如果任何一个future异常完成,allOf
返回的future也会异常完成:
CompletableFuture.allOf(future1, future2, future3)
.exceptionally(ex -> {
System.out.println("有一个future失败了: " + ex.getMessage());
return null;
});
与anyOf的区别
allOf
: 等待所有future完成anyOf
: 等待任意一个future完成
实际应用场景
- 并行执行多个独立任务,等所有任务完成后再继续
- 聚合来自多个微服务的数据
- 批量处理异步操作