Plantre Plantre
首页
后端
技术
硬件
  • 前端文章

    • HTML
    • CSS
    • JavaScript
  • 技术

    • 技术文档
    • GitHub技巧
    • Nodejs
    • 博客搭建
  • 学习笔记

    • 《JavaScript教程》
    • 《JavaScript高级程序设计》
    • 《ES6 教程》
    • 《Vue》
    • 《React》
    • 《TypeScript 从零实现 axios》
    • 《Git》
    • TypeScript
    • JS设计模式总结
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

plantre

一个后端开发者
首页
后端
技术
硬件
  • 前端文章

    • HTML
    • CSS
    • JavaScript
  • 技术

    • 技术文档
    • GitHub技巧
    • Nodejs
    • 博客搭建
  • 学习笔记

    • 《JavaScript教程》
    • 《JavaScript高级程序设计》
    • 《ES6 教程》
    • 《Vue》
    • 《React》
    • 《TypeScript 从零实现 axios》
    • 《Git》
    • TypeScript
    • JS设计模式总结
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 计算机组成原理

  • 操作系统

  • 计算机网络

  • 设计模式

  • Java

    • Java基础

    • Java集合

    • Java并发

      • 共享变量副本与 主内存共享变量的区别
      • 创建线程池的几种方式
      • 线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方式,为什么
      • 异步编程工具CompletableFuture
    • JVM

  • Spring

  • SpringCloud

  • MySQL

  • Redis

  • 分布式

  • Zookeeper

  • Dubbo

  • Kafka

  • 数据结构

  • 算法

  • OJ

  • 从道家哲学看计算机?
  • 后端
  • Java
  • Java并发
plantre
2025-05-08

异步编程工具CompletableFuture

以下是关于 Java CompletableFuture 的全面解析,涵盖核心概念、使用场景及最佳实践:


一、CompletableFuture 的核心优势 CompletableFuture 是 Java 8 引入的异步编程工具,扩展了 Future 接口,解决了传统异步编程的痛点:

  1. 非阻塞回调:通过链式调用处理结果,无需阻塞线程等待任务完成。
  2. 任务编排能力:支持组合多个异步任务(如顺序执行、并行合并),实现复杂业务逻辑。
  3. 灵活异常处理:提供 exceptionally、handle 等方法统一处理成功/失败逻辑。
  4. 性能优化:通过并行执行和异步回调,可将系统响应时间缩短 70%-90%。

二、核心功能与使用场景

  1. 创建异步任务

• 无返回值任务:

CompletableFuture.runAsync(() -> System.out.println("Task running"));
1

• 有返回值任务:

CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> "Result");
1

默认使用 ForkJoinPool,也可通过 Executor 指定自定义线程池。

  1. 链式处理结果

• 转换结果(thenApply):

future.thenApply(s -> s + " processed"); // 返回新值
1

• 消费结果(thenAccept):

future.thenAccept(System.out::println);  // 无返回值
1

• 后续操作(thenRun):

future.thenRun(() -> log.info("Task completed"));
1
  1. 组合多个任务

• 依赖执行(thenCompose):

future.thenCompose(s -> getDetailsAsync(s));  // 扁平化嵌套 Future
1

• 并行合并(thenCombine):

CompletableFuture<Integer> futureA = getPriceAsync();
CompletableFuture<Integer> futureB = getTaxAsync();
futureA.thenCombine(futureB, (a, b) -> a + b); // 合并结果
1
2
3

• 多任务等待(allOf/anyOf):

CompletableFuture.allOf(futureA, futureB).join(); // 等待所有任务完成
1
  1. 异常处理

• 异常恢复(exceptionally):

future.exceptionally(ex -> "Fallback Value");
1

• 统一处理结果与异常(handle):

future.handle((res, ex) -> ex != null ? "Error" : res);
1

• 仅观察结果(whenComplete):

future.whenComplete((res, ex) -> log.info("Result: {}", res));
1

三、高级应用与最佳实践

  1. 线程池优化

• 避免使用默认线程池:在高并发场景下,自定义线程池可防止资源耗尽。

Executor customExecutor = Executors.newFixedThreadPool(10);
CompletableFuture.supplyAsync(() -> task(), customExecutor);
1
2
  1. 与虚拟线程结合

• Java 21 引入的虚拟线程(Thread.ofVirtual())可进一步提升性能,尤其适合 I/O 密集型任务。例如,处理 10 万请求时,虚拟线程耗时仅为传统线程的 1/5。

  1. 性能优化场景

• 接口并行调用:

同时调用用户信息、积分、订单服务,总耗时由 3 秒降至 1 秒。 • 批量处理优化:

使用 CompletableFuture 并行执行数据库更新,减少阻塞时间。


四、典型问题与解决方案

  1. 回调地狱问题

传统嵌套回调会导致代码难以维护,CompletableFuture 通过链式调用解决:

getUserAsync()
    .thenCompose(user -> getOrdersAsync(user))
    .thenAccept(orders -> sendNotification(orders));
1
2
3
  1. 超时控制

通过 orTimeout 或 completeOnTimeout 避免任务长时间阻塞:

future.orTimeout(2, TimeUnit.SECONDS);  // 超时抛异常
future.completeOnTimeout("Timeout", 1, TimeUnit.SECONDS); // 超时返回默认值
1
2
  1. 数据一致性

异步更新数据库和缓存时,需结合事务或补偿机制(如重试队列)。


五、总结 CompletableFuture 的核心价值在于: • 通过声明式 API 简化异步编程复杂度;

• 提升系统吞吐量和响应速度;

• 支持灵活的任务编排与错误恢复。

在企业级应用中,建议结合自定义线程池、虚拟线程和监控工具(如 Prometheus)构建高并发系统。

编辑 (opens new window)
上次更新: 2025/06/10, 09:18:05
线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方式,为什么
JVM内存模型

← 线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方式,为什么 JVM内存模型→

最近更新
01
集成loki
07-04
02
TCP的ESTABLISHED是什么意思
06-24
03
安装1panel
06-24
更多文章>
Theme by Vdoing | Copyright © 2025-2025 plantre | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式