使用 completablefuture.allof() 无法直接获取结果,因为它返回的是 completablefuture<void></void>。要获取所有结果,必须调用 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());
}
}
}
如何封装为通用工具
为了避免每次手动遍历,可以编写一个静态方法,将 allOf 的等待逻辑和结果提取逻辑封装在一起,返回一个包含所有结果的列表。
立即学习“Java免费学习笔记(深入)”;

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());
}
}
处理单个任务异常的情况
如果某个任务抛出异常,allOf 本身不会抛出异常,但调用 join() 获取该特定任务结果时会触发 ExecutionException。在遍历时需要捕获异常以防止中断整个流程。


















