异步编程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 以及相关使用方法提供了异步 ...
 
随机推荐
- mysql 随机选取一条符合条件的记录
			
暂时记录下: SELECT * FROM `kw_user` AS t1 JOIN ( SELECT ROUND( RAND( ) * ( ( SELECT MAX( id ) FROM `kw_u ...
 - Python3解决棋盘覆盖问题的方法示例
			
本文实例讲述了Python3解决棋盘覆盖问题的方法.分享给大家供大家参考,具体如下: 问题描述: 在2^k*2^k个方格组成的棋盘中,有一个方格被占用,用下图的4种L型骨牌覆盖所有棋盘上的其余所有方格 ...
 - Python 图片转字符图
			
pip install Image argparse pillow from PIL import Image import argparse #命令行输入参数处理 parser = argparse ...
 - Linux-鸟菜-5-目录配置-FHS
			
Linux-鸟菜-5-目录配置-FHS 这节内容比较休闲,主要就是介绍Linux的目录配置,也就是那些目录通常是干啥的,这个比较重要,需要我们去了解.但是我觉得通常看一遍记不住啥,也就记个大概,主要还 ...
 - PHP + JQuery 实现多图上传并预览
			
简述 PHP + JQuery实现 前台:将图片进行base64编码,使用ajax实现上传 后台:将base64进行解码,存储至文件夹,将文件名称入库 效果图 功能实现 html <!DOCTY ...
 - php 获取某文件夹(比如共享文件夹)下图片并下载并压缩成zip
			
1.前端部分:直接请求 2.后端php //zip下载public function downZip(){ $pro_code = "test"; //zip名称 //获取列表 $ ...
 - python-内置函数-compile,eval,exec
			
#将字符串,编译成python代码 compile()#执行,有返回值,执行表达式并获取结果 eval()#执行python代码,无返回值,接收:代码或者字符串 exec() s = "pr ...
 - 使用FastDFS进行文件管理
			
使用FastDFS进行文件管理 FastDFS简介 FastDFS: FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储.文件同步.文件访问(文件上传.文件下载)等, ...
 - training11.14
			
7-10 关于堆的判断 (25分) 题目:将一系列给定数字顺序插入一个初始为空的小顶堆H[].随后判断一系列相关命题是否为真.命题分下列几种: x is the root:x是根结点: x and ...
 - 优雅地使用命令行:Tmux 终端复用
			
转自:http://harttle.com/2015/11/06/tmux-startup.html 你是否曾经开过一大堆的Terminal?有没有把它们都保存下来的冲动?Tmux 的Session就 ...