news 2026/5/19 21:32:27

CompletableFuture 实战模板(超时、组合、异常链处理)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
CompletableFuture 实战模板(超时、组合、异常链处理)

这篇给你可直接复用的模板,不讲大道理,讲“真实项目里怎么写才稳”。

先说结论

在项目里写CompletableFuture,最容易出问题的就三件事:

  1. 没有超时(线程一直卡住)
  2. 异常没兜底(主线程卡死 or 悄悄失败)
  3. 线程池乱用(公共池被打爆)

解决思路:有超时、有兜底、有隔离的线程池


一、基础模板:统一线程池 + 超时 + 兜底

ExecutorServicebizPool=newThreadPoolExecutor(16,32,60,TimeUnit.SECONDS,newLinkedBlockingQueue<>(2000),newThreadFactoryBuilder().setNameFormat("biz-%d").build(),newThreadPoolExecutor.CallerRunsPolicy());CompletableFuture<User>future=CompletableFuture.supplyAsync(()->userService.getById(uid),bizPool).orTimeout(800,TimeUnit.MILLISECONDS).exceptionally(ex->{log.warn("userService fallback, uid={}",uid,ex);returnUser.DEFAULT;});

这个模板适合 80% 的“单个异步调用”。


二、并行查询聚合(allOf)

需求:并发查用户、订单、积分

CompletableFuture<User>f1=CompletableFuture.supplyAsync(()->getUser(uid),bizPool);CompletableFuture<Order>f2=CompletableFuture.supplyAsync(()->getOrder(uid),bizPool);CompletableFuture<Point>f3=CompletableFuture.supplyAsync(()->getPoint(uid),bizPool);CompletableFuture<Void>all=CompletableFuture.allOf(f1,f2,f3);UserProfileprofile=all.thenApply(v->{returnnewUserProfile(f1.join(),f2.join(),f3.join());}).orTimeout(1,TimeUnit.SECONDS).exceptionally(ex->UserProfile.fallback(uid)).join();

注意:join()会把异常包装成CompletionException,一定要有兜底。


三、竞速返回(anyOf)

需求:多个数据源取最快结果

CompletableFuture<Result>f1=CompletableFuture.supplyAsync(()->queryA(key),bizPool);CompletableFuture<Result>f2=CompletableFuture.supplyAsync(()->queryB(key),bizPool);Resultresult=CompletableFuture.anyOf(f1,f2).orTimeout(300,TimeUnit.MILLISECONDS).thenApply(r->(Result)r).exceptionally(ex->Result.empty()).join();

四、串行依赖(thenCompose)

需求:先查用户,再查用户的订单

CompletableFuture<Order>future=CompletableFuture.supplyAsync(()->getUser(uid),bizPool).thenCompose(user->CompletableFuture.supplyAsync(()->getOrder(user.getId()),bizPool)).orTimeout(800,TimeUnit.MILLISECONDS).exceptionally(ex->Order.EMPTY);

五、异常链处理(handle vs exceptionally)

CompletableFuture<String>f=CompletableFuture.supplyAsync(()->doWork(),bizPool).handle((res,ex)->{if(ex!=null){log.warn("work failed",ex);return"fallback";}returnres;});

handle能同时拿到结果和异常,适合统一兜底。


六、避免公共线程池被打爆

不要直接用CompletableFuture.supplyAsync()默认线程池,
它用的是ForkJoinPool.commonPool,很容易被其他任务占满。

结论:业务异步一定要用自定义线程池。


七、一个可直接复用的“组合模板”

CompletableFuture<UserProfile>profileFuture=CompletableFuture.supplyAsync(()->getUser(uid),bizPool).thenCombineAsync(CompletableFuture.supplyAsync(()->getOrder(uid),bizPool),(user,order)->newUserProfile(user,order),bizPool).orTimeout(800,TimeUnit.MILLISECONDS).exceptionally(ex->UserProfile.fallback(uid));

最后总结

CompletableFuture最靠谱的姿势是:

  1. 统一线程池
  2. 每段链路加超时
  3. 异常统一兜底
  4. 聚合前后都可回退

只要把这四件事做对,你的异步代码会稳很多。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 7:59:42

如何通过League-Toolkit实现智能游戏体验提升?

如何通过League-Toolkit实现智能游戏体验提升&#xff1f; 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power &#x1f680;. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit League-Toolkit作为一款基于官方LCU…

作者头像 李华
网站建设 2026/4/18 7:59:45

不懂会计也能搞定的CO-PA入门:用值字段和特性玩转销售毛利分析

不懂会计也能搞定的CO-PA入门&#xff1a;用值字段和特性玩转销售毛利分析 在快消品行业摸爬滚打多年的市场总监老张最近遇到了头疼事——每次开会都被财务部用各种利润率报表"降维打击"。产品A在华东区的实际利润到底被运费和促销吃掉多少&#xff1f;新开拓的电商渠…

作者头像 李华
网站建设 2026/4/21 7:53:29

打造本地文生图接口,ollama+diffusers让AI绘画更听话

&#x1f3af; 本文能帮你解决什么&#xff1f; ✅ 把本地AI绘画能力包装成标准REST API ✅ 用ollama自动优化用户输入的中文提示词&#xff08;告别手动写英文长句&#xff09; ✅ 基于diffusers加载dreamshaper8-lcm模型&#xff0c;生成速度快、质量高 ✅ 配置CORS&#xf…

作者头像 李华
网站建设 2026/4/20 20:24:34

微信视频号直播数据捕获技术全解析:从痛点破解到业务价值挖掘

微信视频号直播数据捕获技术全解析&#xff1a;从痛点破解到业务价值挖掘 【免费下载链接】wxlivespy 微信视频号直播间弹幕信息抓取工具 项目地址: https://gitcode.com/gh_mirrors/wx/wxlivespy 破解匿名观众身份识别难题 行业痛点分析 直播场景下&#xff0c;观众身…

作者头像 李华
网站建设 2026/4/21 19:05:22

Mac百度网盘免费加速终极指南:告别龟速下载的完整解决方案

Mac百度网盘免费加速终极指南&#xff1a;告别龟速下载的完整解决方案 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘缓慢的下载速度而…

作者头像 李华
网站建设 2026/4/29 21:54:59

ReadCat小说阅读器:打造纯净无干扰的完整阅读体验

ReadCat小说阅读器&#xff1a;打造纯净无干扰的完整阅读体验 【免费下载链接】read-cat 一款免费、开源、简洁、纯净、无广告的小说阅读器 项目地址: https://gitcode.com/gh_mirrors/re/read-cat 在数字阅读日益普及的今天&#xff0c;你是否厌倦了各种弹窗广告、强制…

作者头像 李华