当前位置: 首页 > news >正文

CompletableFuture 详细讲解

一、CompletableFuture 到底是什么?

一句话:它是 Java 用来做异步任务编排的工具。

它能让你轻松实现:

  1. 异步执行(不阻塞主线程)
  2. 串行执行(A 做完做 B)
  3. 并行执行(A、B 同时做)
  4. AND 汇聚(都做完再执行)
  5. OR 汇聚(一个做完就执行)
  6. 异常统一处理
  7. 超时控制

它 = 异步任务的总指挥


二、核心:两种创建异步任务的方式

有无返回值

1.runAsync () → 无返回值(Runnable)

CompletableFuture<Void> future = CompletableFuture.runAsync(() -> { // 任务:洗水壶、烧开水、发日志、发消息 });

2.supplyAsync () → 有返回值(Supplier)

CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> { // 任务:查数据库、查接口、计算、拿茶叶 return "结果"; });

三、必须记住:线程池问题(生产最重要)

默认线程池 = 危险!禁止用!

// 危险!默认用 ForkJoinPool,线程数=CPU核心数 supplyAsync(()->{}); // 正确!必须用自定义线程池 supplyAsync(()->{}, 自定义线程池);

原因:一个慢任务会拖垮整个系统!

四、四种任务关系(核心中的核心)

1. 串行关系(上一步做完,再做下一步)

thenApply / thenAccept / thenRun / thenCompose

① thenApply:有入有出(数据转换)

future.thenApply(result -> { return "处理后:" + result; });

② thenAccept:有入无出(消费结果)

future.thenAccept(result -> { System.out.println(result); });

③ thenRun:无入无出(最后收尾)

future.thenRun(() -> { System.out.println("任务结束"); });

④ thenCompose:串两个异步任务(最常用)

future.thenCompose(result -> { // 返回新异步任务 return anotherFuture(); });

2. AND 汇聚关系(所有任务完成才执行)

都做完 → 再执行

① thenCombine:合并两个结果

future1.thenCombine(future2, (r1, r2) -> { return r1 + r2; });

② allOf:等待 N 个任务全部完成

CompletableFuture.allOf(f1, f2, f3).join();

典型场景:并行查用户、订单、优惠券


3. OR 汇聚关系(任意一个完成就执行)

谁快谁执行

① applyToEither

future1.applyToEither(future2, result -> { return result; });

② anyOf

CompletableFuture.anyOf(f1, f2, f3);

典型场景:超时降级、主备切换


4. 异常处理

① exceptionally:捕获异常,返回默认值

future.exceptionally(ex -> { return "默认值"; });

② whenComplete:无论成功失败都进入

future.whenComplete((r, ex) -> { // 处理结果或异常 });

③ handle:异常 + 结果都处理

future.handle((r, ex) -> { return r; });

五、超时控制(高可用必备)

future.orTimeout(3, TimeUnit.SECONDS); // 3秒超时

六、获取结果

// 阻塞等待,不抛受检异常 future.join(); // 阻塞等待,抛受检异常 future.get(); // 带超时 future.get(3, TimeUnit.SECONDS);

七、真实业务流程(最标准的示范)

// 1. 异步创建订单 orderService.createAsync(userId) // 2. 串异步扣库存 .thenCompose(orderId -> stockService.deductAsync(orderId)) // 3. 数据转换 .thenApply(success -> "结果:" + success) // 4. 日志 .thenAccept(log::info) // 5. 异常处理 .exceptionally(ex -> { log.error("失败", ex); return "异常"; });
http://www.jsqmd.com/news/988763/

相关文章:

  • 【新 Linux 服务器上手全攻略】系统巡检、存储规划与开发环境初始化
  • 正规的郑州geo服务商有哪些
  • Claude Code 的 Skills:AI Agent 真正需要的不是提示词,而是组织记忆
  • 【Altium】DRC 覆铜警告纠正建议
  • 如何用Sunshine在10分钟内搭建高效的个人游戏串流服务器?
  • 华为云发布Agentic AI系列新品 打造智能时代“硅基黑土地”
  • AI中医ChatiSS查体大模型全流程解析,辨证准确率凭什么可以做到95.8%
  • 聊天式 AI 剪辑工作流解析:自然语言如何驱动多步视频处理
  • 2026年 耐高温丁晴密封圈品牌推荐榜:高温耐油、高压耐用与长寿命品质之选 - 品牌发掘
  • 报销流程混乱,问题到底出在哪里?
  • 深入解析MC68HC805P18:经典8位MCU架构、中断与EEPROM编程实战
  • 微信网页版终极解决方案:wechat-need-web 浏览器扩展实用指南
  • 本地运行的年会抽奖工具,改JS名单就能抽,中奖实时可见
  • 2026年惠州中央空调回收品牌推荐与选择攻略 - 广东再生资源回收
  • 揭秘AI教材写作技巧:低查重工具加持,5天完成30万字教材编写!
  • 2026 天津漏水检测与修缮机构实测盘点 5 家合规服务商参考(含卫生间专项维修) - 宅安选房屋修缮
  • 数字电源开发实战:JTAG与SCI接口在DSC调试中的协同应用
  • Beyond Compare 5终极激活指南:5分钟解锁完整功能
  • 计算机毕业设计基于ECharts的电脑销售信息可视化平台设计与实现
  • Flutter+Go微服务架构:点餐源码系统小程序性能优化实战(附代码)
  • 欧奥电子车载移动UFS4.1验证:mSMP与B2B 高保真探测技术详解
  • i.MX 7ULP异构多核架构解析:平衡性能与功耗的嵌入式设计实践
  • 2026年6月成都本地人私藏高分火锅合集|全店口碑4.8分+,闭眼吃不踩坑 - TOP10品牌推荐榜单
  • 恒流IC/ NU402在LED模组中的应用
  • 描述符(Descriptors)‌
  • 2026年绕线机厂家推荐榜:电线电缆/铜丝钢丝/高速伺服自动绕线机优质品牌深度解析 - 品牌发掘
  • 第 15 集:Claude Code上下文工程学 —— 根治“80% 问题”
  • 2026年6月佛山回收中央空调公司推荐,正规资质环保处理更合规 - 广东再生资源回收
  • 当信号与系统遇见深度学习:我用傅里叶变换和拉普拉斯算子,看懂了CNN的本质
  • 如何打造个人专属的数字记忆库:从微信数据到生活足迹的完整指南