type
status
date
slug
summary
tags
category
icon
password

一、概念

CompletableFuture 是 Java 8 引入的 异步编程工具类,位于 java.util.concurrent 包下,是 Future 接口的增强版。
传统 Future 的问题:
  1. 阻塞获取结果:必须调用 get() 才能拿到结果,且可能阻塞线程。
  1. 无法链式处理:不能在结果出来后自动触发下一步操作。
  1. 缺乏组合能力:多个异步任务的组合很不方便。
👉 CompletableFuture 解决了这些问题
  • 支持非阻塞回调(异步计算完成后自动执行回调)。
  • 提供链式调用(类似 Java Stream)。
  • 可以组合多个任务(并行、串行、任意完成)。
  • 灵活控制线程池,避免阻塞主线程。

二、适用场景

  1. 并行调用多个服务接口
      • 例如:查询用户信息时,同时调用「基本信息服务」「积分服务」「订单服务」,然后合并结果。
  1. 任务依赖与组合
      • 一个任务完成后自动执行另一个任务(A → B → C)。
  1. 超时控制 & 异常处理
      • 某个接口超时/失败时,可以降级处理。
  1. 替代复杂的回调地狱(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. 异常处理

输出:

五、最佳实践建议

  1. 指定线程池
    1. 异常必须处理
        • 使用 exceptionallyhandle
    1. 避免阻塞 get()
        • 建议用回调代替 future.get()
    1. 复杂任务用组合 API
        • 使用 thenCombinethenComposeallOfanyOf

    ✅ 总结:
    CompletableFuture 是 Java 异步编程的核心工具,尤其适用于高并发场景、服务聚合、超时降级