讲师中心 微信公众号
AI工具推荐 视频效率加速

CompletableFuture入门实战_多任务流水线式编排的简单实现

胖雪酱_4244

胖雪酱_4244

发布时间:2026-02-22 02:07:28

|

778人浏览过

|

来源于php中文网

原创

该选supplyAsync()还是runAsync()取决于是否需要返回值:需结果用supplyAsync()(返回CompletableFuture),纯执行用runAsync()(返回CompletableFuture);IO密集型任务优先supplyAsync(),火种型操作用runAsync()更语义清晰。

completablefuture入门实战_多任务流水线式编排的简单实现

CompletableFuture.runAsync() 和 supplyAsync() 到底该选哪个

看返回值:要结果就用 supplyAsync(),它返回 CompletableFuture<t></t>;纯执行不关心返回值,用 runAsync()。很多人一上来就写 runAsync(),后面想链式取结果时才发现没得取——因为它的返回类型是 CompletableFuture<void></void>,实际是 CompletableFuture> 且无法安全 cast。

常见错误现象:runAsync(() -> doSomething()).thenApply(x -> x.toString()) 编译失败,报错 incompatible types: cannot infer type-variable(s) U。

  • IO 密集型任务(如调用 HTTP 接口、读文件)优先用 supplyAsync(),方便后续 thenCompose() 或 thenAccept()
  • 如果只是发通知、打日志、清缓存这类“火种型”操作,runAsync() 更语义清晰
  • 两者默认都走 ForkJoinPool.commonPool(),高并发下容易挤占 CPU 密集任务资源,生产环境建议显式传入自定义线程池

thenCompose() vs thenCombine():流水线分叉合并怎么选

关键区别在依赖关系:thenCompose() 是“串行依赖”,前一个 future 的结果是后一个 future 的输入;thenCombine() 是“并行汇合”,两个独立 future 都完成之后,用它们的结果一起算第三个值。

典型误用:把两个无关的异步请求写成 f1.thenCompose(r1 -> f2.thenApply(r2 -> r1 + r2)),这会让 f2 等待 f1 完成才启动,白白增加总耗时。

  • 需要“查用户 → 查订单 → 合并渲染”这种强依赖链,用 thenCompose()
  • 需要“查用户信息”和“查用户权限”两个独立请求完成后拼装视图,用 thenCombine()
  • thenCompose() 内部必须返回一个新的 CompletableFuture;thenCombine() 第二个参数是普通函数,不许再返回 future

exceptionally() 和 handle() 处理异常时的隐蔽差异

exceptionally() 只捕获上游抛出的异常,且只能返回 fallback 值(类型需与原始 future 一致);handle() 是万能兜底,无论成功还是异常都会进,而且可以返回不同类型(比如异常时返回空对象,成功时返回业务实体)。

容易踩的坑:用 exceptionally() 想记录日志+返回默认值,结果发现日志没打——因为 exceptionally() 不接收正常结果,你得额外加 whenComplete() 才能覆盖全路径。

  • 只做简单降级(如“查不到用户就返回 Guest”),用 exceptionally() 更轻量
  • 需要统一打日志、埋点、或根据 success/failed 分支走不同逻辑,直接上 handle()
  • handle() 里别 throw 新异常,否则下游又得套一层 handle,容易嵌套失控

join() 和 get() 在 WebFlux 或 Servlet 3.0+ 环境里千万别混用

join() 不抛受检异常,get() 抛 ExecutionException 和 InterruptedException;但更关键的是:在 Netty 或 Tomcat NIO 线程上直接调用这两个方法会阻塞事件循环线程,导致整个服务吞吐暴跌。

现象:压测时 QPS 上不去,线程堆栈里大量 CompletableFuture.join 卡在 LockSupport.park。

  • Spring WebFlux 默认线程模型下,所有 join()/get() 都属于反模式,必须用 thenApply()、thenAccept() 这类非阻塞回调
  • Servlet 容器(如 Tomcat)启用异步支持后,也应避免在 AsyncContext.start() 外部调用阻塞方法
  • 真要同步等(比如单元测试),确保线程池不是 commonPool(),且 timeout 设置合理,避免死等

CompletableFuture 的流水线编排能力很强,但它的“非阻塞契约”很硬——一旦在不该阻塞的地方用了阻塞调用,问题不会立刻暴露,而是在高并发或慢依赖场景下突然恶化。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

Flowith
Flowith Hot

Flowith是一款基于画布和智能体工作流的 AI 协作工作空间。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

相关专题

更多
如何配置Tomcat环境变量
如何配置Tomcat环境变量

配置Tomcat环境变量需要在系统中添加CATALINA_HOME变量,并将Tomcat的安装路径添加到PATH变量中。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

905

2023.10.26

idea如何集成Tomcat
idea如何集成Tomcat

idea集成Tomcat的步骤:1、添加Tomcat服务器配置;2、配置项目部署;3、运行Tomcat服务器;4、访问项目;5、注意事项;6、关闭Tomcat服务器。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

324

2024.02.23

怎么查看Tomcat源代码
怎么查看Tomcat源代码

查看Tomcat源代码的步骤:1、下载Tomcat源代码;2、在IDEA中导入Tomcat源代码;3、查看源代码;4、理解Tomcat的工作原理;5、参与社区和贡献;6、注意事项;7、持续学习和更新;8、使用工具和插件。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

489

2024.02.23

常见的tomcat漏洞有哪些
常见的tomcat漏洞有哪些

常见的tomcat漏洞有:1、跨站脚本攻击;2、跨站请求伪造;3、目录遍历漏洞;4、缓冲区溢出漏洞;5、配置漏洞;6、第三方组件漏洞。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

305

2024.02.23

tomcat日志乱码怎么解决
tomcat日志乱码怎么解决

tomcat日志乱码的解决办法:1、修改tomcat的日志编码设置;2、检查ide的编码设置;3、检查操作系统的编码设置;4、使用过滤器处理日志;5、检查外部系统的编码设置;6、检查文件编码方式等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

348

2024.02.23

weblogic和tomcat有哪些区别
weblogic和tomcat有哪些区别

weblogic和tomcat的区别:1、功能;2、性能;3、规模;4、价格;5、安全性;6、配置和管理;7、社区支持;8、集成能力;9、升级和更新;10、可靠性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

349

2024.02.23

tomcat和nginx有哪些区别
tomcat和nginx有哪些区别

tomcat和nginx的区别:1、应用领域;2、性能;3、功能;4、配置;5、安全性;6、扩展性;7、部署复杂性;8、社区支持;9、成本;10、日志管理。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

601

2024.02.23

tomcat启动闪退怎么解决
tomcat启动闪退怎么解决

tomcat启动闪退的解决办法:1、检查java环境;2、检查环境变量配置;3、检查端口被占用;4、检查配置文件编码;5、检查启动时需要的配置文件;6、检查相关文件是否丢失;7、检查防火墙和杀毒软件设置。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

322

2024.02.23

Docker Desktop怎么设置端口映射
Docker Desktop怎么设置端口映射

本专题聚焦Docker Desktop容器端口映射与访问配置,整理从创建容器、设置端口绑定到验证本地服务访问的操作流程。针对端口被占用、映射配置错误、容器服务无法访问等情况,也提供相应的检查方向,方便用户完成端口配置。

0

2026.11.03

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn