知识卡片
合并等待全部
内容
allOf 表达多个异步任务全部完成后再继续,适合并行 RPC、批量加载——thenCombine() 只能合并两个任务,两个以上才用 allOf。必须明确:allOf 只是完成屏障,不是成功屏障——有一个子任务异常,组合阶段也异常;都成功时 allOf 也不自动合并结果,仍要逐个访问原 Future 取值。应先给子任务规划异常兜底。
参考来源
- 位置:《Java高并发核心编程.卷2,多线程、锁、JMM、JUC、高并发设计模式》第10章《CompletableFuture异步回调》10.3.4节《allOf()等待所有的任务结束》(源文件:_epub-src/OEBPS/Text/chapter316.xhtml);JDK 官方文档核实 allOf 的完成/异常语义([JDK CompletableFuture](https://docs.oracle.com/en/java/javase/12/docs/api/java.base/java/util/concurrent/CompletableFuture.html):若任一入参异常完成,返回的 CompletableFuture 也异常完成)。
- 结论依据:原文说明“CompletionStage接口的allOf()会等待所有的任务结束,以合并所有的任务。thenCombine()只能合并两个任务,如果需要合并多个异步任务,那么可以调用allOf()”,示例中`all.join()`之后并没有从all本身取出四个任务各自的结果,而是各任务在自己的Runnable里各自打印,说明allOf本身不产出合并结果;结合JDK文档对allOf异常语义的说明,共同推出本卡结论。
- 原始内容:CompletionStage接口的allOf()会等待所有的任务结束,以合并所有的任务。thenCombine()只能合并两个任务,如果需要合并多个异步任务,那么可以调用allOf()。