当前位置: 首页 > 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.rkmt.cn/news/1500512.html

相关文章:

  • 单配六维力传感器采集卡/模块的方法 EtherCAT ECT-FT6B北京锐灵科技ray0.cn
  • 【新 Linux 服务器上手全攻略】系统巡检、存储规划与开发环境初始化
  • 报销流程混乱,问题到底出在哪里?
  • 华为云发布Agentic AI系列新品 打造智能时代“硅基黑土地”
  • 聊天式 AI 剪辑工作流解析:自然语言如何驱动多步视频处理
  • 微信网页版终极解决方案:wechat-need-web 浏览器扩展实用指南
  • Beyond Compare 5终极激活指南:5分钟解锁完整功能
  • i.MX 7ULP异构多核架构解析:平衡性能与功耗的嵌入式设计实践
  • 2026年6月成都本地人私藏高分火锅合集|全店口碑4.8分+,闭眼吃不踩坑 - TOP10品牌推荐榜单
  • 描述符(Descriptors)‌
  • 2026年绕线机厂家推荐榜:电线电缆/铜丝钢丝/高速伺服自动绕线机优质品牌深度解析 - 品牌发掘
  • 第 15 集:Claude Code上下文工程学 —— 根治“80% 问题”
  • 如何打造个人专属的数字记忆库:从微信数据到生活足迹的完整指南
  • 非技术背景AIPM技术学习攻略:不学废、不内卷、刚好够用
  • AIOps 智能日志模式挖掘与异常关联:从日志海洋到结构化洞察
  • 光伏电缆厂家盘点:从资质产能看选型适配方向 - 互联网科技品牌测评
  • 2026年 电热管源头厂家推荐榜单:模温机电热管/单头法兰式/双头高温/PET电热管专业选购指南 - 品牌发掘
  • LPC800 USART ISP协议详解与实战:构建稳定现场固件升级方案
  • GitHub 上 Stars 最多的 8 个开源 AI Assistant 工具
  • 回文子串(Palindromic Substrings)—— 题解
  • 拆解 GEO 底层技术壁垒:融景科技凭借两项自研国家软著,服务中铁、华润、碧桂园等头部企业,打破湛江 AI 优化市场贴牌工具困局 - 广东科技观察
  • 2026年广东GEO优化推广榜单:豆包/元宝/DeepSeek AI平台搜索代运营,助力制造业工厂与灯具五金家具行业精准营销 - 品牌发掘
  • 规范用药能降73%死亡率,可惜很多心衰患者没坚持住
  • 告别Token烧钱焦虑!「秒云Tokens管家」智能预警,筑牢AI成本防线
  • [智能体-333]:LangGraph代码示例,详细注解:基础线性图、条件分支、循环、人在回路
  • 英雄联盟Akari助手:3个核心功能让你游戏效率提升500%的免费开源工具
  • 2026年 广东/东莞铁艺装饰花件厂家推荐榜:失蜡铸造花件、铁艺装饰花件源头工厂专业实力与精工匠心之选 - 品牌发掘
  • 孔夫子旧书网批量抓取工具:自动登录+商品信息提取+Excel导出
  • 北京配眼镜功能性镜片怎么选,五类场景逐一对照 - 配眼镜新资讯
  • 五指毛桃赤小豆膏:从古籍配伍到现代轻养生的配方逻辑