whencomplete 是 completablefuture 的回调方法,用于任务完成(无论成功或异常)后执行监控逻辑,参数为 biconsumer,不改变结果、不阻塞主线程,适合日志、状态标记等旁路操作。

whenComplete 是 CompletableFuture 提供的回调方法,用于在异步任务**完成(无论成功或异常)后立即执行一段逻辑**,是监控任务完成状态最直接、轻量的方式之一。
核心作用:统一响应完成事件
它不改变原始结果,也不影响任务流程,只做“事后通知”。参数是 BiConsumer<t throwable></t>,第一个是正常结果(若无返回值则为 Void),第二个是异常对象(成功时为 null)。
- 任务成功 → 第一个参数有值,第二个为
null - 任务失败 → 第一个参数为
null(或默认值),第二个是抛出的异常 - 适合做日志记录、状态标记、资源清理等旁路操作
典型用法:标记完成 + 收集异常
比如启动多个员工线程并统一跟踪完成情况:
CompletableFuture<void> employee2 = CompletableFuture.runAsync(() -> {
try { Thread.sleep(3000); }
catch (InterruptedException e) { throw new RuntimeException(e); }
}, POOL)
.whenComplete((v, t) -> {
System.out.println("二号员工完成了任务");
if (t != null) throwableList.add(t); // 异常不吞掉,留待后续处理
});
</void>
注意:whenComplete 是异步回调,本身不阻塞主线程;它运行在线程池线程上(不是主线程),除非显式指定执行器。
和 exceptionally / handle 的区别
如果你只想处理异常且需要返回替代值,用 exceptionally;如果想统一转换结果(不管成败),用 handle;而 whenComplete 更适合“只看一眼、不插手结果”的监控场景:
-
whenComplete:只消费,不返回新 CompletableFuture -
exceptionally:仅捕获异常,返回降级值,链式继续 -
handle:统一处理成功/失败,可修改返回值并延续链
配合 allOf 实现批量任务完成监控
当要等一组异步任务全部结束再做汇总判断,可用 CompletableFuture.allOf + whenComplete:
CompletableFuture<void> all = CompletableFuture.allOf(f1, f2, f3);
all.whenComplete((v, t) -> {
System.out.println("所有任务已结束(含可能的异常)");
// 此处可遍历 f1/f2/f3 的 getNow() 或 join() 拿各自结果
});
</void>
⚠️ 注意:allOf 返回的是 CompletableFuture<void></void>,它只表示“全部提交完毕”,不代表每个子任务都成功——具体成败仍需单独检查各 future 的状态或结果。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











