异步编程CompletableFuture
多线程优化性能,串行操作并行化
串行操作
// 以下2个都是耗时操作
doBizA();
doBizB();
修改变为并行化
new Thread(() -> doBizA()).start();
new Thread(() -> doBizB()).start();
异步化,是并行方案的基础,利用多线程优化性能。性能优化是大厂的核心需求
jdk1.8提供了CompletableFuture 来支持异步编程
CompletableFuture工具类还是很复杂的,需要做好心理准备
1.CompletableFuture实现烧水泡茶

任务3需要等待任务1和任务2都完成才能开始
范例
public static void tea(){
CompletableFuture<Void> f1 = CompletableFuture.runAsync(() -> {
System.out.println("T1:洗水壶...");
sleep(1);
System.out.println("T1:烧开水...");
sleep(15);
});
CompletableFuture<String> f2 = CompletableFuture.supplyAsync(() -> {
System.out.println("T2:洗茶壶...");
sleep(1);
System.out.println("T2:洗茶杯...");
sleep(2);
System.out.println("T2:拿茶叶...");
sleep(1);
return "龙井";
});
CompletableFuture<String> f3 = f1.thenCombine(f2,(__, tea) -> {
System.out.println("T1:拿到茶叶:" + tea);
System.out.println("T1:泡茶...");
return "tea:" + tea;
});
System.out.println(f3.join());
}
核心4个静态方法
runAsync(Runnable runnable) runnable接口的run方法没有返回值
supplyAsync(Supplier<U> supplier) Supplier接口的get方法有返回值
这2个方法,有重载方法,重载方法,支持传入自定义的线程池对象,默认不传使用的是jdk带的ForkJoinPool线程池,默认线程数是cpu核数的2倍
强烈建议,不同的业务类型创建不同的线程池,不要随便使用ForkJoinPool线程池,避免互相干扰
注意:
2个关注点
异步操作什么时候结束
如何获取异步操作的执行结果
都可以通过future接口get来解决
2.理解CompletionStage接口
1.串行关系
CompletableFuture f0 = CompletableFuture.supplyAsync( () -> "Hello World") //①
.thenApply(s -> s + " QQ") //②
.thenApply(String::toUpperCase);//③
System.out.println(f0.join());//输出结果HELLO WORLD QQ
2.AND汇聚关系
// 等f1,f2都执行完,f3开始执行
CompletableFuture<String> f3 = f1.thenCombine(f2,(__, tea) -> {
System.out.println("T1:拿到茶叶:" + tea);
System.out.println("T1:泡茶...");
return "tea:" + tea;
});
异步编程CompletableFuture的更多相关文章
- 异步编程CompletableFuture实现高并发系统优化之请求合并
先说场景: 根据Redis官网介绍,单机版Redis的读写性能是12万/秒,批量处理可以达到70万/秒.不管是缓存或者是数据库,都有批量处理的功能.当我们的系统达到瓶颈的时候,我们考虑充分的压榨缓存和 ...
- java8的版本对组合式异步编程
讨论了Java 8中的函数式数据处理,它可以将对集合数据的多个操作以流水线的方式组合在一起.本节继续讨论Java 8的新功能,主要是一个新的类CompletableFuture,它是对65节到83节介 ...
- Java编程的逻辑 (94) - 组合式异步编程
本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http: ...
- 从CompletableFuture到异步编程设计
从CompletableFuture到异步编程设计,笔者就分为2部分来分享CompletableFuture异步编程设计,前半部分总结下CompletableFuture使用实践,后半部分分享下Com ...
- 有了 CompletableFuture,使得异步编程没有那么难了!
本文导读: 业务需求场景介绍 技术设计方案思考 Future 设计模式实战 CompletableFuture 模式实战 CompletableFuture 生产建议 CompletableFutur ...
- 编程老司机带你玩转 CompletableFuture 异步编程
本文从实例出发,介绍 CompletableFuture 基本用法.不过讲的再多,不如亲自上手练习一下.所以建议各位小伙伴看完,上机练习一把,快速掌握 CompletableFuture. 个人博文地 ...
- 搞定 CompletableFuture,并发异步编程和编写串行程序还有什么区别?你们要的多图长文
你有一个思想,我有一个思想,我们交换后,一个人就有两个思想 If you can NOT explain it simply, you do NOT understand it well enough ...
- 带你玩转CompletableFuture异步编程
前言 最近在忙生活的第一个OKR,这个等等后面具体聊聊,今天开始恢复每周一篇原创,感谢小伙伴的不离不弃.这篇文章也是最近在Code Review的时候,看到的大家代码,想整体推下大家异步编程的思想,由 ...
- 异步编程利器:CompletableFuture
一.一个示例回顾Future 一些业务场景我们需要使用多线程异步执行任务,加快任务执行速度. JDK5新增了Future接口,用于描述一个异步计算的结果.虽然 Future 以及相关使用方法提供了异步 ...
随机推荐
- 一篇博文让你学会HTML5
HTML 什么是HTML HTML(HyperText Markup Language,超文本标记语言)是用来描述网页的一种语言,它不是一种编程语言,而是一种标记语言. 认识HTML HTML5是构建 ...
- 源码篇:ThreadLocal的奇思妙想(万字图文)
前言 ThreadLocal的文章在网上也有不少,但是看了一些后,理解起来总感觉有绕,而且看了ThreadLocal的源码,无论是线程隔离.类环形数组.弱引用结构等等,实在是太有意思了!我必须也要让大 ...
- linux下export命令添加删除环境变量
Linux export命令参数 功能说明:设置或显示环境变量. 语 法:export [-fnp][变量名称]=[变量设置值] 补充说明:在shell中执行程序时,shell会提供一组环境变量. ...
- hdu1526 二分匹配+ floyd
题意: 有N个插座,M个用电器,和K种转换器(每种有无限个),问最少多少个用电器无法充电. 思路 : 总的电器数 减去 电器和插座的最大匹配数 我有的是map去映射每一个串,根据转换器建边,然后跑一 ...
- POJ3692 最大点权独立集元素个数
题意: n个男孩和m个女孩,给你他们谁和谁彼此了解,问你要找到一个集合,使得这个集合中的男孩和女孩相互了解,并且人数最多. 思路: 简单题目,其实就是在求最大点权独立集元素个数,先 ...
- Windows Pe 第三章 PE头文件-EX-相关编程-2(RVA_FOA转换)
RVA-FOA之间转换 1.首先PE头加载到内存之后是和文件头内容一样的,就算是偏移不同,一个是磁盘扇区大小(400H)另一个是内存页大小(1000H),但是因为两个都是开头位置,所以相同. 2.看下 ...
- 7 IDEA连接数据库
IDEA连接数据库 连接成功后,选择数据库 查看数据库/表的内容就双击数据库 修改数据库--要点击DB才能保存 出现问题 错误描述 Server returns invalid timezone. G ...
- PhpStorm个性化设置推荐
预览 字体 字体使用jetbrains的mono,前往下载:如何安装,字体安装完成之后Restart,可在PhpStorm settings中搜索 font 进行启用 mono 字体 主题 主题推荐使 ...
- 全套visio版本安装教程及下载地址
1:visio 2003 安装教程及下载地址 https://mp.weixin.qq.com/s/vhJUagKBz3vM-Dru0cwYow 2:visio 2007 安装教程及下载地址 http ...
- 记一次 .NET 某医院HIS系统 CPU爆高分析
一:背景 1. 讲故事 前几天有位朋友加 wx 抱怨他的程序在高峰期总是莫名其妙的cpu爆高,求助如何分析? 和这位朋友沟通下来,据说这问题困扰了他们几年,还请了微软的工程师过来解决,无疾而终,应该还 ...