thenaccept是completablefuture的回调方法,用于前序任务成功完成并返回非null结果时执行无返回值的消费操作,不处理异常、不产生新completablefuture,适合日志打印等副作用场景。

thenAccept 是 CompletableFuture 提供的一个回调方法,用于在异步任务完成且有结果(非 null)时,**消费该结果(即执行某个无返回值的操作)**,不产生新 CompletableFuture,也不处理异常。
核心用法:接收结果并执行副作用操作
它接受一个 Consumer<t></t> 函数式接口,参数类型与前序 CompletableFuture 的泛型一致。适合做日志打印、更新 UI、发通知、写缓存等“只用结果、不传下去”的场景。
- 只能链式调用在已知有结果的 CompletableFuture 后(如
supplyAsync、thenApply等返回非 void 的 stage 之后) - 不会阻塞主线程,执行时机由前序任务完成触发
- 若前序任务抛出异常或被取消,
thenAccept不会执行
基本示例:打印异步计算结果
比如从远程获取用户 ID,再用它查用户名:
CompletableFuture.supplyAsync(() -> fetchUserId()) // 返回 Integer
.thenApply(id -> fetchUserNameById(id)) // 返回 String
.thenAccept(name -> System.out.println("欢迎:" + name)); // 消费 String,无返回
这里 thenAccept 接收的是 String 类型的 name,仅做打印,不改变流程走向。
注意:不能处理异常,需搭配 exceptionHandler
thenAccept 对异常完全静默 —— 前序 stage 抛异常时,它直接跳过。如需容错,应使用 whenComplete 或 handle:
whenComplete((result, ex) -> { if (ex != null) logError(ex); else logSuccess(result); })-
handle((result, ex) -> ex != null ? "默认名" : result.toUpperCase())(可返回新值)
与 thenAcceptAsync 的区别
thenAccept 默认在**前序任务完成的同一个线程**中执行(可能为 ForkJoinPool 线程);thenAcceptAsync 则提交到公共 ForkJoinPool 或指定 Executor,适用于耗时消费操作(如写数据库),避免阻塞上游线程。
// 耗时操作建议用 async 版本 future.thenAcceptAsync(name -> saveToDB(name), databaseExecutor);
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











