whenComplete是CompletableFuture的回调方法,用于任务无论成功或失败时统一执行逻辑,接收BiConsumer参数,不改变原结果、不抑制异常、不支持链式返回;适用于日志、资源清理等收尾操作。

whenComplete 是 Java CompletableFuture 提供的一个回调方法,用于在异步任务**无论成功或失败**时都执行指定逻辑,适合做统一收尾、日志记录、资源清理等操作。
whenComplete 的基本用法
它接收一个 BiConsumer<t throwable></t> 参数:第一个参数是正常结果(成功时为计算值,失败时为 null),第二个参数是异常(成功时为 null)。注意:它不改变原始 CompletableFuture 的结果,也不会影响后续链式调用。
示例:
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);
}
});
与 handle 的关键区别
whenComplete 不返回新 CompletableFuture,也不支持修改结果;handle 可以返回新值并继续链式调用。
立即学习“Java免费学习笔记(深入)”;
- 用
whenComplete:只关心“做完没”,比如打日志、发通知、关连接 - 用
handle:需要根据结果或异常转换成新值,比如把异常转为默认值、包装错误响应
实际使用注意事项
- 回调在异步任务所在的线程中执行(除非显式指定执行器),不要在其中做耗时或阻塞操作
- 如果想确保回调在特定线程(如主线程)执行,可用
whenCompleteAsync(..., executor) - 多个
whenComplete调用会按注册顺序依次执行,互不影响 - 它不会抑制异常——如果异步任务抛出异常,该异常仍会向下游传播(除非被
exceptionally或handle捕获)
典型应用场景
- 统一记录任务耗时:
long start = System.nanoTime(); ... whenComplete((r, e) -> log.info("耗时: {}ms", (System.nanoTime()-start)/1_000_000)) - 释放临时资源(如数据库连接、文件句柄),即使出错也要关闭
- 更新 UI 状态(配合 FX/Android 主线程调度器)
- 发送监控埋点:成功/失败各记一次指标


















