type
status
date
slug
summary
tags
category
icon
password
一、概念
CompletableFuture
是 Java 8 引入的 异步编程工具类,位于 java.util.concurrent
包下,是 Future
接口的增强版。传统
Future
的问题:- 阻塞获取结果:必须调用
get()
才能拿到结果,且可能阻塞线程。
- 无法链式处理:不能在结果出来后自动触发下一步操作。
- 缺乏组合能力:多个异步任务的组合很不方便。
👉
CompletableFuture
解决了这些问题:- 支持非阻塞回调(异步计算完成后自动执行回调)。
- 提供链式调用(类似 Java Stream)。
- 可以组合多个任务(并行、串行、任意完成)。
- 灵活控制线程池,避免阻塞主线程。
二、适用场景
- 并行调用多个服务接口
- 例如:查询用户信息时,同时调用「基本信息服务」「积分服务」「订单服务」,然后合并结果。
- 任务依赖与组合
- 一个任务完成后自动执行另一个任务(A → B → C)。
- 超时控制 & 异常处理
- 某个接口超时/失败时,可以降级处理。
- 替代复杂的回调地狱(Callback Hell)
- 用链式写法让异步逻辑更清晰。
三、核心方法分类
方法 | 用途 | 示例 |
runAsync(Runnable) | 异步执行,无返回值 | 日志异步写入 |
supplyAsync(Supplier) | 异步执行,有返回值 | 远程服务调用 |
thenApply(Function) | 任务完成后,处理返回值 | result -> result * 2 |
thenAccept(Consumer) | 任务完成后,消费结果,无返回 | 打印结果 |
thenRun(Runnable) | 任务完成后,执行额外逻辑 | 写日志 |
thenCombine/thenCompose | 组合多个任务 | 合并查询结果 |
allOf/anyOf | 等待所有 / 任意任务完成 | 聚合服务结果 |
exceptionally/handle | 异常处理 | 超时降级 |
四、实战示例
1. 基础异步调用
输出:
2. 并行调用多个接口 → 聚合结果
输出:
3. 任意一个任务完成即返回
输出:
4. 异常处理
输出:
五、最佳实践建议
- 指定线程池
- 异常必须处理
- 使用
exceptionally
或handle
- 避免阻塞 get()
- 建议用回调代替
future.get()
。
- 复杂任务用组合 API
- 使用
thenCombine
、thenCompose
、allOf
、anyOf
。
✅ 总结:
CompletableFuture
是 Java 异步编程的核心工具,尤其适用于高并发场景、服务聚合、超时降级。