whenComplete 是 CompletableFuture 的异步回调方法,无论任务成功或异常完成均执行,接收 BiConsumer 参数,不改变原结果、不返回新 future。

whenComplete 是 Java CompletableFuture 提供的一个异步回调方法,用于在任务**无论成功或异常完成时都执行一段逻辑**,常用于资源清理、日志记录、状态更新等场景。
核心特点:不关心结果,只响应完成事件
它接收一个 BiConsumer 参数:第一个参数是正常结果(成功时为实际值,失败时为 null),第二个参数是异常(成功时为 null)。你无需手动判断是否异常,只需根据两个参数的非空情况做分支处理。
它不改变原始 CompletableFuture 的结果或状态,也不会返回新的 future(返回的是原 future,支持链式调用)。
基本用法示例
假设有一个异步任务:
CompletableFuture<string> future = CompletableFuture.supplyAsync(() -> {
// 模拟可能出错的操作
if (Math.random() > 0.5) throw new RuntimeException("随机失败");
return "操作成功";
});
future.whenComplete((result, ex) -> {
if (ex != null) {
System.err.println("任务异常:" + ex.getMessage());
} else {
System.out.println("任务完成,结果:" + result);
}
});
</string>
常见使用场景与建议
- 统一收尾处理:比如关闭数据库连接、释放锁、发送完成通知——只要任务结束了就执行,不管成不成功
-
记录执行耗时或状态日志:配合
System.nanoTime()记录开始时间,在whenComplete中计算并打印耗时 -
避免阻塞主线程:它的回调默认在任务完成所在的线程中执行(可能是 ForkJoinPool 线程),如需指定线程池,请用
whenCompleteAsync(..., executor) -
注意空指针风险:当任务返回
null值且无异常时,result和ex都为null,需小心判空
和 handle / thenAccept/thenRun 的区别
whenComplete 不修改结果、不中断链路;handle 可以返回新值并继续链式传递;thenAccept 只处理成功结果,thenRun 连结果都不关心。选哪个取决于你是否要“透传结果”以及“是否只关注成功”。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











