使用 completablefuture.allof() 无法直接获取结果,因为它返回的是 completablefuture。要获取所有结果,必须调用 join() 方法等待完成,然后遍历原始的 completablefuture[] 数组并逐个调用 get() 或 join()。

allOf 为什么返回 Void
因为 allOf 的设计初衷是作为“屏障”来同步多个任务的执行状态,而不是为了聚合数据。它只关心是否全部完成,不关心任务的具体返回值类型,因此泛型被固定为 Void。

import java.util.concurrent.CompletableFuture;
public class Main {
public static void main(String[] args) throws Exception {
CompletableFuture<string> f1 = CompletableFuture.supplyAsync(() -> "A");
CompletableFuture<string> f2 = CompletableFuture.supplyAsync(() -> "B");
// 1. 创建 allOf 屏障
CompletableFuture>[] futures = {f1, f2};
CompletableFuture.allOf(futures).join();
// 2. 遍历原始数组获取结果
for (CompletableFuture> f : futures) {
System.out.println(f.join());
}
}
}</string></string>
如何封装为通用工具
为了避免每次手动遍历,可以编写一个静态方法,将 allOf 的等待逻辑和结果提取逻辑封装在一起,返回一个包含所有结果的列表。

import java.util.List;
import java.util.stream.Collectors;
import java.util.concurrent.CompletableFuture;
public class FutureUtils {
public static <t> List<t> getAllResults(CompletableFuture<t>... futures) {
CompletableFuture.allOf(futures).join();
return java.util.Arrays.stream(futures)
.map(CompletableFuture::join)
.collect(Collectors.toList());
}
}</t></t></t>
处理单个任务异常的情况
如果某个任务抛出异常,allOf 本身不会抛出异常,但调用 join() 获取该特定任务结果时会触发 ExecutionException。在遍历时需要捕获异常以防止中断整个流程。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











