【Java异步编程利器】CompletableFuture完全指南
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 + " (已完成)";
});
}
}
六、学习路线图
新手阶段
掌握supplyAsync
+thenAccept
基础组合
理解异步编程思想进阶阶段
熟练使用thenApply
数据转换
学习thenCompose
扁平化处理高手阶段
掌握多任务组合(allOf
/anyOf
)
深入理解异常处理机制专家技巧
自定义线程池优化性能
与Stream API结合使用
关键思考:
CompletableFuture 就像餐厅的点餐系统,让:
- 厨师(工作线程)在后台烹饪
- 服务员(回调方法)负责通知
- 顾客(主线程)无需苦苦等待
掌握这个模式,你的Java应用性能将获得质的飞跃!
【Java异步编程利器】CompletableFuture完全指南的更多相关文章
- java异步编程降低延迟
目录 java异步编程降低延迟 一.ExecutorService和CompletionService 二.CompletableFuture(重要) 三.stream中的parallel(并行流) ...
- 【Android实战】----从Retrofit源代码分析到Java网络编程以及HTTP权威指南想到的
一.简单介绍 接上一篇[Android实战]----基于Retrofit实现多图片/文件.图文上传中曾说非常想搞明确为什么Retrofit那么屌. 近期也看了一些其源代码分析的文章以及亲自查看了源代码 ...
- [置顶]
【Android实战】----从Retrofit源码分析到Java网络编程以及HTTP权威指南想到的
一.简介 接上一篇[Android实战]----基于Retrofit实现多图片/文件.图文上传中曾说非常想搞明白为什么Retrofit那么屌.最近也看了一些其源码分析的文章以及亲自查看了源码,发现其对 ...
- Java 异步编程的几种方式
前言 异步编程是让程序并发运行的一种手段.它允许多个事情同时发生,当程序调用需要长时间运行的方法时,它不会阻塞当前的执行流程,程序可以继续运行,当方法执行完成时通知给主线程根据需要获取其执行结果或者失 ...
- Java 异步编程 (5 种异步实现方式详解)
同步操作如果遇到一个耗时的方法,需要阻塞等待,那么我们有没有办法解决呢?让它异步执行,下面我会详解异步及实现@mikechen 目录 什么是异步? 一.线程异步 二.Future异步 三.Comp ...
- Paip.Php Java 异步编程。推模型与拉模型。响应式(Reactive)”编程FutureData总结... 1
Paip.Php Java 异步编程.推模型与拉模型.响应式(Reactive)"编程FutureData总结... 1.1.1 异步调用的实现以及角色(:调用者 提货单) F ...
- 异步编程利器:CompletableFuture
一.一个示例回顾Future 一些业务场景我们需要使用多线程异步执行任务,加快任务执行速度. JDK5新增了Future接口,用于描述一个异步计算的结果.虽然 Future 以及相关使用方法提供了异步 ...
- Java 异步编程
昨天头儿给的学习文档我还没看完,头儿说:“MongoDB光会简单的添删改查什么的不行,要深入了解,你们连$set和$inc使用场景都分不清.” 确实,学习过一年多SQL,确实对学习MongoDB有点影 ...
- Java异步编程——深入源码分析FutureTask
Java的异步编程是一项非常常用的多线程技术. 之前通过源码详细分析了ThreadPoolExecutor<你真的懂ThreadPoolExecutor线程池技术吗?看了源码你会有全新的认识&g ...
- java异步编程
异步编程提供了一个非阻塞事件驱动的模型.通过异步消除阻塞,可以让web服务响应更多请求.可以让系统更高效的执行.比如log框架,记录日志或异常时异步执行可避免影响正常业务流程的执行. 异步变成如何把线 ...
随机推荐
- 微服务实战系列(九)-注册中心与网关高可用架构设计-copy
1. 微服务关系架构图 简要说明: (1)所有应用或者服务要想对外提供服务(包括网关),必须首先到注册中心进行注册. (2)所有访问通过服务网关进行访问,然后由服务网关路由到对应服务中心进行交互访问. ...
- Sharding-JDBC分库分表
https://blog.csdn.net/bochuangli/article/details/123029392 https://blog.csdn.net/bochuangli/article/ ...
- Spring Cloud的5大核心组件详解
Spring Cloud Spring Cloud 是一套完整的微服务解决方案,基于 Spring Boot 框架,准确的说,它不是一个框架,而是一个大的容器,它将市面上较好的微服务框架集成进来,从而 ...
- PICO 避坑指南
1. Win10 不需要串口驱动,使用PICO W之前先刷固件pico w的固件 micropython-firmware-pico-w-290622.rar 刚开始 刷的固件不对,一直无法识别串口. ...
- Superset config配置文件参数
superset配置文件config.py文件参数修改相关影响:1.如果让dashboard左侧出现筛选器,dashboard可交叉筛选,将以下三个参数设置为True "DASHBOARD_ ...
- 路由协议过程概述--ospf-01
路由是数据通信网络中最基本的要素.路由信息就是指导报文发送的路径信息,路由的过程就是报文转发的过程. 根据路由目的地的不同,路由可划分为: 网段路由:目的地为网段,IPv4地址子网掩码长度小于32位或 ...
- 玩转云端|够轻松!天翼云边缘安全加速平台AccessOne助力企业解决远程办公难题!
本文分享自天翼云开发者社区<玩转云端|够轻松!天翼云边缘安全加速平台AccessOne助力企业解决远程办公难题>,作者:天翼云社区官方账号 省去早起挤地铁的苦恼,享受居家办公的从容不迫-- ...
- kvm远程管理
列出centos7中所有的虚拟机 [root@kvm1 ~]# virsh list --all Id Name State ------------------------------------- ...
- 11. Docker 微服务实战(将项目打包生成镜像,在 Docker 当中作为容器实例运行)
11. Docker 微服务实战(将项目打包生成镜像,在 Docker 当中作为容器实例运行) @ 目录 11. Docker 微服务实战(将项目打包生成镜像,在 Docker 当中作为容器实例运行) ...
- SQL取系统时间的前一个月的月份和年份
SQL SERVER 提供了一些时间函数:取当前时间:select getdate()取前一个月的时间:SELECT DATEADD(MONTH,-1,GETDATE()) 月份减一个月取年份:SEL ...