用completablefuture构建异步流水线,核心是通过thenapply/thencompose串联、thencombine/thenacceptboth合并、exceptionally/handle兜底、supplyasync配自定义线程池来函数式表达串行、并行与错误处理逻辑。

用 CompletableFuture 构建异步流水线,核心是把串行依赖、并行分支、错误兜底这些逻辑,用函数式链式调用自然表达出来,而不是靠手动管理线程或回调嵌套。
用 thenApply / thenCompose 串联计算步骤
每个阶段返回新值就用 thenApply;如果返回的是另一个 CompletableFuture(比如要继续异步调用),就用 thenCompose,避免嵌套 CompletableFuture。
-
thenApply:同步转换结果,例如把 ID 转成用户对象后取姓名 -
thenCompose:异步续跑,例如查完用户再查其订单(第二个操作本身是异步的) - 别混用
thenApply返回CompletableFuture,否则会变成CompletableFuture<completablefuture>></completablefuture>
用 thenCombine / thenAcceptBoth 合并多个异步结果
当两个独立异步任务都完成后再聚合处理(比如“查用户”和“查配置”并行执行,之后一起组装响应),优先选 thenCombine。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
-
thenCombine:接收两个CompletableFuture,返回新结果(有返回值) -
thenAcceptBoth:只消费两个结果,不返回新值(适合打日志、发通知等副作用) - 两者都等两个 future 都完成才触发,任一失败则整个链失败(除非提前 handle)
用 exceptionally / handle 统一处理异常
流水线中任意一步抛异常,默认会中断后续执行。用 exceptionally 提供降级值,或用 handle 同时处理成功和异常路径(更灵活)。
-
exceptionally:只在异常时调用,返回替代结果,类型需匹配上游 -
handle:无论成功失败都会执行,参数是 (result, throwable),可区分处理 - 注意:
exceptionally不会捕获thenApply中抛出的新异常,必要时要在内部 try-catch 或换用handle
用 supplyAsync + 自定义线程池控制并发资源
不要依赖默认 ForkJoinPool,尤其在 I/O 密集场景(如远程调用、DB 查询)。显式传入线程池,避免阻塞影响其他异步任务。
- 创建专用线程池:
new ThreadPoolExecutor(10, 20, 60L, TimeUnit.SECONDS, new LinkedBlockingQueue()) - 所有入口异步操作用
supplyAsync(() -> ..., pool)启动 - 后续
thenApply等默认在前一个任务完成的线程上执行;如需切线程,用thenApplyAsync(..., pool)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










