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

为什么会有 CompletableFuture?它是为了解决什么痛点的?

前言

在 Java 的并发世界里,我们曾经习惯使用 Future 来表示“将来可能得到的结果”。但使用久了你就会发现——Future 就像一个“没长大的孩子”:

  • 👉 你必须主动去阻塞等待结果调用 get()),浪费了宝贵的线程资源。
  • 👉 它不能链式组合多个任务,每一步都得手动管理。
  • 👉 想要处理异步计算的异常?不好意思,没有太多好办法。
  • 👉 想要多个任务之间协调?代码一团乱麻。

于是,CompletableFuture 横空出世,像是 Java 并发工具箱中的“全能王”。

CompletableFuture 能做什么?为什么它这么香?

  • 🔄 链式异步编排:可以像搭积木一样,把多个异步操作串起来 ( thenApply, thenCompose, thenCombine…),逻辑清晰、优雅。

  • 💡 非阻塞处理结果:无需再get()阻塞等待,可以用回调处理结果,提升性能。

  • 统一处理异常:通过 exceptionally, handle 等方法,优雅应对失败情况。

  • 🤝 多个任务协同执行:比如 allOf, anyOf,让你轻松管理多个并发任务。

  • ⚙️ 与线程池无缝结合:结合 Executor 灵活指定线程策略,让异步任务更加可控。

    我们总结下
    CompletableFuture 提供了:

    特性说明
    非阻塞异步编程支持在任务完成后自动执行下一步(回调机制)
    任务组合多个任务之间可以顺序执行、并行执行、合并结果
    链式调用使用 .thenApply(), .thenCompose(), .thenAccept() 等方法构建建任务链
    异常处理.exceptionally(), .handle() 处理失败情况
    超时控制.orTimeout() .completeOnTimeout() 等方法

    一句话:CompletableFuture 是 Java 8 引入的一个重要类,属于 java.util.concurrent 包,它的出现是为了解决 异步编程 和 回调地狱(Callback Hell) 的问题,并提供更强大、更灵活的 并发任务编排能力。

用它的场景有哪些?

  • 🔍 异步调用远程服务(比如微服务之间调用)
  • 💼 多个接口并发调用聚合数据
  • 🎬 任务编排、流程控制(如用户下单、扣库存、发短信)
  • 💥 高并发、高吞吐的业务处理场景
  • 📉 非阻塞化改造传统阻塞代码,释放线程资源
  • 🔍异步任务执行(不阻塞主线程)
  • 💼服务组合调用(多个子系统的数据合并处理)
  • 🎬Web 请求处理(如 Spring WebFlux 或高并发场景)
  • 💥异步 I/O 操作(如数据库/网络)
  • 📉构建复杂异步任务流水线(pipeline)
  • 🔍响应式编程(Reactive)中间层支持

使用示例

  1. 基本用法:异步执行任务
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {// 耗时计算return "Hello";
});future.thenAccept(result -> {System.out.println("结果: " + result);
});
  1. 任务组合:先执行 A,再执行 B
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> "Hello").thenApply(result -> result + " World"); // 继续处理结果future.thenAccept(System.out::println); // 输出: Hello World
  1. 两个任务并行执行,合并结果
CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> "Hello");
CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> "World");CompletableFuture<String> combined = future1.thenCombine(future2, (a, b) -> a + " " + b);combined.thenAccept(System.out::println); // 输出: Hello World
  1. 异常处理
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {if (true) throw new RuntimeException("出错了");return "正常结果";
}).exceptionally(ex -> {return "默认值";
});future.thenAccept(System.out::println); // 输出: 默认值

和 Future 的对比总结

功能FutureCompletableFuture
异步任务
阻塞获取结果✅(get())✅(get())
非阻塞回调
任务链式编排
多任务组合
异常处理
超时控制有限支持

源码当中的应用

在这里插入图片描述

在这里插入图片描述

http://www.dtcms.com/a/298689.html

相关文章:

  • Pandas 处理缺失数据
  • 为 GitHub Pages 站点配置自定义域(Windows)(Linked Page)
  • Android Ntp系统校时流程
  • C#(基本语法)
  • 人工智能冗余:大语言模型为何有时表现不佳(以及我们能做些什么)
  • 推荐系统多目标排序模型以及融合策略
  • WebSocket详解
  • ClickHouse 高性能实时分析数据库-物化视图篇
  • 学习笔记《区块链技术与应用》第二天 共识机制
  • 亚马逊阿联酋推“Amazon Bazaar”:解码中东电商市场的本地化突围
  • 线程安全的单例模式
  • 基于米尔瑞芯微RK3576开发板部署运行TinyMaix:超轻量级推理框架
  • 2025年高防IP全景解读:从流量清洗到智能防御的核心跃迁
  • mib2c --生成标量数据对应c文件
  • NOIP普及组系列【2015】 P2669 [NOIP 2015 普及组] 金币题解
  • GPU 驱动安装升级测试
  • 避开算力坑!无人机桥梁检测场景下YOLO模型选型指南
  • Minio Docker 集群部署
  • 【阅读整理】野火ADC_AD7192模块资料
  • haproxy七层代理(超详细)
  • 算法讲解--查找总价值为目标值的两个商品
  • MyBatisPlus简介与基本CRUD
  • 域名服务器的作用是什么
  • 【js(7)创建对象的三种写法】
  • Node.js(三)之Express
  • Three.js 动画系统入门:Tween.js 与 AnimationMixer 的使用
  • 习题5.6 “数学黑洞“
  • Java研学-RabbitMQ(二)
  • 亚德诺半导体AD8612ARUZ-REEL双通道精密运算放大器,0.5μV超低失调电压+0.02μV/°C温漂!
  • 老龄化浪潮下的破局者:智慧养老重塑银发经济格局