runafterboth 在两个 completablefuture 都完成(无论成功或异常)后执行无参 runnable,返回 completablefuture 用于链式调用,不依赖结果也不影响返回值。

runAfterBoth 用于在两个 CompletableFuture 都完成(无论成功或异常)后,触发一个无返回值的后续动作(Runnable),它不依赖前两个任务的结果,也不影响链式执行的返回值。
基本用法:等待两个任务完成后再执行
调用 runAfterBoth 时传入两个 CompletableFuture 和一个 Runnable。只要两者都“完成”(包括正常结束、抛出异常、被取消),就会执行该 Runnable。
- 它不关心任务是成功还是失败,只关注“完成状态”
- 返回一个新的
CompletableFuture<void></void>,可用于继续链式调用(如thenRun、exceptionally) - 如果任一前置任务抛出异常,
runAfterBoth中的Runnable仍会执行;但后续的thenRun等方法若依赖结果,则需用whenComplete或handle处理异常
代码示例:简单场景
模拟两个异步操作(如查用户、查订单),完成后打印日志:
CompletableFuture<string> userFuture = CompletableFuture.supplyAsync(() -> {
try { Thread.sleep(1000); } catch (InterruptedException e) {}
return "Alice";
});
CompletableFuture<integer> orderFuture = CompletableFuture.supplyAsync(() -> {
try { Thread.sleep(800); } catch (InterruptedException e) {}
return 101;
});
// 两个都完成后执行
CompletableFuture<void> afterBoth = userFuture.runAfterBoth(orderFuture, () -> {
System.out.println("用户和订单数据均已获取完毕");
});
// 可选:等待最终完成(实际项目中通常不阻塞)
afterBoth.join(); // 输出:用户和订单数据均已获取完毕</void></integer></string>
注意异常情况下的行为
如果其中一个任务失败,runAfterBoth 的 Runnable 依然会执行 —— 这是它的设计特点。但若需区分成功/失败,应改用 thenCombine(要求都成功)或搭配 whenComplete:
- 用
whenComplete检查两个 future 是否都正常完成 - 若需获取结果并处理,优先考虑
thenCombine(都成功才调用 BiFunction) - 若仅需“兜底清理”(如释放资源、发通知),
runAfterBoth很合适
常见误区提醒
不要误以为 runAfterBoth 会等待两个任务“都成功”。它等的是“都完成”,包括异常终止。例如:
- userFuture 正常返回,orderFuture 抛出
RuntimeException→Runnable仍会执行 - 若想只在两者都成功时执行逻辑,改用
thenCombine并配合空实现的 fallback - 不要在
Runnable中直接访问前序任务结果 —— 它没有参数;需要结果请用thenCombine或allOf+join
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











