Java异步编程利器:CompletableFuture完全指南



图:传统同步 vs 异步编程模式对比


一、为什么需要异步编程?

同步 vs 异步的餐厅点餐比喻

同步方式 异步方式
顾客站在柜台前等待厨师做完餐 顾客拿到取餐号后可以坐下玩手机
期间不能做其他事情 餐准备好后会通知顾客
类似传统Future.get()的阻塞调用 类似CompletableFuture的回调机制

现实场景

当你的应用需要:

  • 调用多个外部API
  • 执行数据库查询
  • 处理文件I/O

    使用异步编程可以显著提升系统吞吐量!

二、CompletableFuture 初体验

1. 创建最简单的异步任务

CompletableFuture.runAsync(() -> {
System.out.println(" 厨师开始烹饪...");
sleep(2000); // 模拟耗时操作
System.out.println(" 菜品完成!");
});
System.out.println(" 您可以继续玩手机等待通知");

输出顺序

 您可以继续玩手机等待通知
厨师开始烹饪...
(2秒后)
菜品完成!

2. 带返回值的异步任务

CompletableFuture<String> mealFuture = CompletableFuture.supplyAsync(() -> {
sleep(1500);
return " 芝士汉堡";
}); // 获取结果(阻塞方式,实际慎用)
String meal = mealFuture.join();
System.out.println("您点的 " + meal + " 已送达");

三、核心功能详解

1. 回调方法三剑客

方法 描述 示例
thenApply 转换结果 .thenApply(meal -> "热的 " + meal)
thenAccept 消费结果 .thenAccept(System.out::println)
thenRun 执行后续操作 .thenRun(() -> cleanKitchen())

示例代码

CompletableFuture.supplyAsync(() -> " 拉面")
.thenApply(dish -> " 热的 " + dish)
.thenAccept(System.out::println)
.thenRun(() -> System.out.println(" 打包完成"));

2. 任务组合技巧

(1) 顺序执行(汉堡+薯条套餐)

CompletableFuture.supplyAsync(() -> " 汉堡")
.thenCompose(burger ->
CompletableFuture.supplyAsync(() -> burger + " + 薯条"))
.thenAccept(System.out::println);

(2) 并行执行(同时准备主食和饮料)

CompletableFuture<String> mainCourse =
supplyAsync(() -> " 咖喱饭");
CompletableFuture<String> drink =
supplyAsync(() -> " 可乐"); mainCourse.thenCombine(drink, (food, drink) ->
"套餐:" + food + " 配 " + drink)
.thenAccept(System.out::println);

四、异常处理实战

1. 基础异常捕获

CompletableFuture.supplyAsync(() -> {
if (Math.random() > 0.5) {
throw new RuntimeException(" 厨房着火啦!");
}
return " 披萨";
}).exceptionally(ex -> {
System.out.println("补偿方案:" + ex.getMessage());
return " 免费面包";
});

2. 统一异常处理

.handle((result, ex) -> {
if (ex != null) {
return "️ 出餐失败:" + ex.getMessage();
}
return result + " (特制版)";
});

五、完整餐厅模拟系统

public class RestaurantSystem {
public static void main(String[] args) {
// 并行准备主菜和汤
CompletableFuture<String> mainCourse = cookAsync(" 牛排", 3000);
CompletableFuture<String> soup = cookAsync(" 蘑菇汤", 2000); // 组合结果
mainCourse.thenCombine(soup, (m, s) -> "主餐:" + m + "\n汤品:" + s)
.thenAccept(order -> {
System.out.println("====== 您的订单 ======");
System.out.println(order);
}); // 饭后甜点(顺序执行)
mainCourse.thenCompose(food ->
cookAsync(" 冰淇淋", 1000))
.thenAccept(dessert ->
System.out.println("餐后甜点:" + dessert));
} static CompletableFuture<String> cookAsync(String dish, int time) {
return CompletableFuture.supplyAsync(() -> {
System.out.println("‍ 开始制作:" + dish);
sleep(time);
return dish + " (已完成)";
});
}
}

六、学习路线图

  1. 新手阶段

    掌握 supplyAsync + thenAccept 基础组合

    理解异步编程思想

  2. 进阶阶段

    熟练使用 thenApply 数据转换

    学习 thenCompose 扁平化处理

  3. 高手阶段

    掌握多任务组合(allOf/anyOf

    深入理解异常处理机制

  4. 专家技巧

    自定义线程池优化性能

    与Stream API结合使用


关键思考

CompletableFuture 就像餐厅的点餐系统,让:

  • 厨师(工作线程)在后台烹饪
  • 服务员(回调方法)负责通知
  • 顾客(主线程)无需苦苦等待

掌握这个模式,你的Java应用性能将获得质的飞跃!

【Java异步编程利器】CompletableFuture完全指南的更多相关文章

  1. java异步编程降低延迟

    目录 java异步编程降低延迟 一.ExecutorService和CompletionService 二.CompletableFuture(重要) 三.stream中的parallel(并行流) ...

  2. 【Android实战】----从Retrofit源代码分析到Java网络编程以及HTTP权威指南想到的

    一.简单介绍 接上一篇[Android实战]----基于Retrofit实现多图片/文件.图文上传中曾说非常想搞明确为什么Retrofit那么屌. 近期也看了一些其源代码分析的文章以及亲自查看了源代码 ...

  3. [置顶] 【Android实战】----从Retrofit源码分析到Java网络编程以及HTTP权威指南想到的

    一.简介 接上一篇[Android实战]----基于Retrofit实现多图片/文件.图文上传中曾说非常想搞明白为什么Retrofit那么屌.最近也看了一些其源码分析的文章以及亲自查看了源码,发现其对 ...

  4. Java 异步编程的几种方式

    前言 异步编程是让程序并发运行的一种手段.它允许多个事情同时发生,当程序调用需要长时间运行的方法时,它不会阻塞当前的执行流程,程序可以继续运行,当方法执行完成时通知给主线程根据需要获取其执行结果或者失 ...

  5. Java 异步编程 (5 种异步实现方式详解)

    ​ 同步操作如果遇到一个耗时的方法,需要阻塞等待,那么我们有没有办法解决呢?让它异步执行,下面我会详解异步及实现@mikechen 目录 什么是异步? 一.线程异步 二.Future异步 三.Comp ...

  6. Paip.Php Java 异步编程。推模型与拉模型。响应式(Reactive)”编程FutureData总结... 1

    Paip.Php  Java 异步编程.推模型与拉模型.响应式(Reactive)"编程FutureData总结... 1.1.1       异步调用的实现以及角色(:调用者 提货单) F ...

  7. 异步编程利器:CompletableFuture

    一.一个示例回顾Future 一些业务场景我们需要使用多线程异步执行任务,加快任务执行速度. JDK5新增了Future接口,用于描述一个异步计算的结果.虽然 Future 以及相关使用方法提供了异步 ...

  8. Java 异步编程

    昨天头儿给的学习文档我还没看完,头儿说:“MongoDB光会简单的添删改查什么的不行,要深入了解,你们连$set和$inc使用场景都分不清.” 确实,学习过一年多SQL,确实对学习MongoDB有点影 ...

  9. Java异步编程——深入源码分析FutureTask

    Java的异步编程是一项非常常用的多线程技术. 之前通过源码详细分析了ThreadPoolExecutor<你真的懂ThreadPoolExecutor线程池技术吗?看了源码你会有全新的认识&g ...

  10. java异步编程

    异步编程提供了一个非阻塞事件驱动的模型.通过异步消除阻塞,可以让web服务响应更多请求.可以让系统更高效的执行.比如log框架,记录日志或异常时异步执行可避免影响正常业务流程的执行. 异步变成如何把线 ...

随机推荐

  1. 消息中间件之-Kafka相关知识

    前言 本篇文章是我基于拉勾kafka课程所作的笔记,包括Kafka基本架构.核心概念.生产者解析.消费者解析.存储.事务.一致性保证等等,希望对大家有所帮助. 一.kafka架构 Kafka基础知识 ...

  2. Linux计划任务定时备份数据

    最近有项目需要定期备份mysql数据的需求,通过linux系统的crontab计划任务实现了一个简单demo,通过mysqldump命令对mysql数据进行备份. 首先新建一个脚本文件:mysqlba ...

  3. 让你看懂dart中静态成员和继承

    静态属性和静态方法 在dart中,我们可以通过关键字 static来定义静态属性和静态方法. 需要注意的是: 静态方法不能访问非静态属性[结论1] 非静态方法可以访问静态成员[结论2] 我们通过下面的 ...

  4. dart中所有的循环详解

    List MyList = ['苹果', '栗子', '小苹果']; for (var i = 0; i < MyList.length; i++) { print(MyList[i]); } ...

  5. 无耳科技 Solon v3.0.7 发布(2025农历新年版)

    Solon 框架! Solon 框架由杭州无耳科技有限公司(下属 Noear 团队)开发并开源.是新一代,面向全场景的 Java 企业级应用开发框架.从零开始构建(非 java-ee 架构),有灵活的 ...

  6. C#/.NET/.NET Core技术前沿周刊 | 第 24 期(2025年1.27-1.31)

    前言 C#/.NET/.NET Core技术前沿周刊,你的每周技术指南针!记录.追踪C#/.NET/.NET Core领域.生态的每周最新.最实用.最有价值的技术文章.社区动态.优质项目和学习资源等. ...

  7. [BZOJ2194] 快速傅立叶之二 题解

    看名字,然后准备转化为多项式乘法. \[c_k=\sum_{i=0}^{n-k-1}a_{i+k}b_i \] 将 \(a\) 反转,得: \[c_k=\sum_{i=0}^{n-k-1}a_{n-i ...

  8. 腾讯解禁 QQ 极速版,且看我收集的最全 QQ 各类版本

    因为利益关系,腾讯早就限制QQ极速版的登录了,近日居然解除限制了,面对越来越臃肿的QQ,我给大伙准备了几十个版本的QQ,总有一个适合你. QQ版本合集 给大伙们收集了QQ版本合集,分别有历史版本.精简 ...

  9. 从零构建你的第一个RESTful API:HTTP协议与API设计超图解指南 🌐

    title: 从零构建你的第一个RESTful API:HTTP协议与API设计超图解指南 date: 2025/2/26 updated: 2025/2/26 author: cmdragon ex ...

  10. 创建一个MCP服务器,并在Cline中使用,增强自定义功能。

    MCP介绍 MCP 是一个开放协议,它标准化了应用程序如何向LLMs提供上下文.可以将 MCP 视为 AI 应用程序的 USB-C 端口.正如 USB-C 提供了一种标准化的方法来将您的设备连接到各种 ...