CompletableFuture处理复杂依赖的核心是用链式方法明确表达任务间关系:thenCompose实现串行依赖并展平嵌套,thenCombine/thenAcceptBoth合并并行结果,allOf/anyOf协调多任务生命周期,exceptionally/handle/whenComplete提供分层异常兜底。

CompletableFuture 处理复杂业务依赖的核心,是把“谁等谁、谁用谁、谁出错谁兜底”这些逻辑,用链式方法明确表达出来,而不是靠手动线程管理或嵌套回调。
用 thenCompose 表达串行依赖:前一个结果驱动后一个任务
当 B 任务必须等 A 的结果才能启动(比如查用户 → 查该用户的订单 → 查订单对应的商品),不能用 thenApply,否则会嵌套 CompletableFuture
- thenApply:对结果做转换,返回普通值,适合加工数据(如 String → User)
- thenCompose:把上一步结果作为参数,启动一个新的异步任务,自动展平嵌套,保持单层 CompletableFuture 链
示例:获取用户后异步查其订单
CompletableFutureCompletableFuture
- > orderFuture = userFuture.thenCompose(user ->
CompletableFuture.supplyAsync(() -> orderService.findByUserId(user.getId())));
用 thenCombine / thenAcceptBoth 合并两个独立但需协同的结果
当两个任务并行执行,但后续逻辑需要它们的共同输出(比如同时拉取库存和价格,再计算是否可售),就用组合类方法:
立即学习“Java免费学习笔记(深入)”;
- thenCombine:两个 CompletableFuture 都完成,把结果传给 BiFunction,返回新值
- thenAcceptBoth:同样等两者完成,但只消费结果,不返回新 CompletableFuture
- 注意:两个任务默认并行;若其中一个失败,整个链会走 exceptionally
示例:库存 + 价格合并判断可售性
CompletableFutureCompletableFuture
CompletableFuture
用 allOf 或 anyOf 协调多个并行任务的生命周期
allOf 和 anyOf 不直接处理结果,而是生成一个“协调 Future”,用于统一控制多个任务的完成时机:
- allOf:所有任务都完成才算完成(适合“全部成功才继续”,如聚合报表三张表)
- anyOf:任意一个完成即触发(适合“只要一个能用就行”,如多通道短信发送选最快通路)
- ⚠️ 注意:allOf 返回的是 CompletableFuture
,要获取各子任务结果,得先 join 所有原始 future,再手动 collect
示例:等用户、订单、优惠策略全部返回后组装响应
CompletableFutureCompletableFuture
- > o = supplyAsync(() -> getOrders());
CompletableFuture
CompletableFuture.allOf(u, o, p).thenRun(() -> {
User user = u.join(); // 必须显式 join 获取结果
List
Promotion promo = p.join();
buildResponse(user, orders, promo);
});
异常传播与降级:在任意环节捕获、转换或兜底
复杂依赖链中,任一环节失败都会中断后续流程。CompletableFuture 提供了细粒度异常控制能力:
- exceptionally:仅捕获本阶段异常,返回替代结果(如查不到用户就返回空对象)
- handle:无论成功失败都执行,可区分处理(适合记录日志+返回兜底值)
- whenComplete:只做副作用(如埋点、清理资源),不改变结果或异常
示例:支付调用失败时自动切到备用通道
CompletableFutureprimary.exceptionally(ex -> {
if (ex.getCause() instanceof TimeoutException) {
return supplyAsync(() -> payViaWechat(req)).join(); // 切微信
}
return PayResult.failed("unknown error");
});


















