thenAccept是CompletableFuture中用于执行无返回值副作用操作的方法,接收Consumer,上游正常完成时执行且不改变结果类型,返回CompletableFuture;异常或取消时不触发,默认同线程执行。

thenAccept 是 CompletableFuture 中专用于“消费结果、不返回新值”的方法,适合做日志、通知、缓存写入等副作用操作。
核心作用:只执行,不产出
它接收一个 Consumer
- 上游失败(抛异常或被 cancel),thenAccept 不会触发
- 函数内部抛出异常,会作为当前阶段的完成异常(包装为 CompletionException)
- 默认在上游任务完成的同一线程中执行,不切换线程(除非显式用 thenAcceptAsync)
基本用法:传入 Consumer,处理结果
例如异步获取用户 ID 后打印信息:
CompletableFuture<string> idFuture = CompletableFuture.supplyAsync(() -> "u123");
idFuture.thenAccept(id -> System.out.println("收到用户ID:" + id));
</string>
这段代码不会阻塞主线程,也不会返回新 future;它只是在 ID 准备好后,立刻执行打印动作。
常见使用场景
适合轻量级、无返回、纯副作用的操作:
- 记录操作日志:
thenAccept(user -> log.info("用户登录成功: {}", user.getName())) - 写入本地缓存:
thenAccept(data -> cache.put("latest", data)) - 发送监控指标:
thenAccept(result -> metrics.counter("task.success").increment()) - 清理临时资源(需确保上游一定成功):
thenAccept(file -> file.deleteOnExit())
注意事项:别踩这些坑
容易误用的地方:
- 不能在 thenAccept 里 return 值——它不是转换方法,编译直接报错
- 不要指望它能继续链式调用后续逻辑(比如接 thenApply),因为它返回 Void
- 若需同时处理成功和失败,应搭配 whenComplete 或 exceptionally,而不是只靠 thenAccept
- 涉及 I/O 或耗时操作(如发 HTTP 请求),建议用 thenAcceptAsync 并指定自定义线程池,避免阻塞 commonPool
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











