CompletableFuture--给future调用增加回调或聚合操作
CompletableFuture--增大内存节省时间。整合多个future调用,来减少时间
例如:第一个future 返回时1s,第二个返回时2s,第三个返回是3s CompletableFuture 可以聚合这个三个future,为每个future增加回调,使在3s内处理完这三个future.
1.定义urserInfo
package com.zhou.test.completableFuturetest; /**
* Copyright (C), 2015-2020, XXX有限公司
* FileName: UserInfo
* Author: Administrator
* Date: 2020/2/28 13:39
* Description:
*/
public class UserInfo {
private Integer id;
private String name;
private Integer jobId;
private String jobDes;
private Integer carId;
private String carDes;
private Integer homeId;
private String homeDes; public Integer getId() {
return id;
} public UserInfo setId(Integer id) {
this.id = id;
return this;
} public String getName() {
return name;
} public UserInfo setName(String name) {
this.name = name;
return this;
} public Integer getJobId() {
return jobId;
} public UserInfo setJobId(Integer jobId) {
this.jobId = jobId;
return this;
} public String getJobDes() {
return jobDes;
} public UserInfo setJobDes(String jobDes) {
this.jobDes = jobDes;
return this;
} public Integer getCarId() {
return carId;
} public UserInfo setCarId(Integer carId) {
this.carId = carId;
return this;
} public String getCarDes() {
return carDes;
} public UserInfo setCarDes(String carDes) {
this.carDes = carDes;
return this;
} public Integer getHomeId() {
return homeId;
} public UserInfo setHomeId(Integer homeId) {
this.homeId = homeId;
return this;
} public String getHomeDes() {
return homeDes;
} public UserInfo setHomeDes(String homeDes) {
this.homeDes = homeDes;
return this;
}
}
2.定义
package com.zhou.test.completableFuturetest; import java.util.concurrent.TimeUnit; /**
* Copyright (C), 2015-2020, XXX有限公司
* FileName: QueryUtils
* Author: Administrator
* Date: 2020/2/28 13:40
* Description:
*/
public class QueryUtils {
public String queryCar(Integer carId) {
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "car_desc";
} public String queryJob(Integer jobId) {
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "job_desc";
} public String queryHome(Integer homeId) {
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "home_desc";
}
}
3.定义
package com.zhou.test.completableFuturetest;
import java.util.function.Supplier;
/**
* Copyright (C), 2015-2020, XXX有限公司
* FileName: QuerySuppiler
* Author: Administrator
* Date: 2020/2/28 13:42
* Description:
*/
public class QuerySuppiler implements Supplier<String> {
private Integer id;
private String type;
private QueryUtils queryUtils; public QuerySuppiler(Integer id, String type, QueryUtils queryUtils) {
this.id = id;
this.type = type;
this.queryUtils = queryUtils;
} @Override
public String get() {
if ("home".equals(type)) {
return queryUtils.queryHome(id);
} else if ("job".equals(type)) {
return queryUtils.queryJob(id);
} else if ("car".equals(type)) {
return queryUtils.queryCar(id);
}
return null;
}
}
4.定义
package com.zhou.test.completableFuturetest; import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.function.Consumer;
import java.util.function.Supplier;
import java.util.stream.Collectors; /**
* @author idea * @data 2020/2/22
*/
public class QueryUserService {
private Supplier<QueryUtils> queryUtilsSupplier = QueryUtils::new; public UserInfo converUserInfo(UserInfo userInfo) {
long begin = System.currentTimeMillis();
QuerySuppiler querySuppiler1 = new QuerySuppiler(userInfo.getCarId(), "car", queryUtilsSupplier.get());
CompletableFuture<String> getCarDesc = CompletableFuture.supplyAsync(querySuppiler1);
getCarDesc.thenAccept(new Consumer<String>() { //--1
@Override
public void accept(String carDesc) {
userInfo.setCarDes(carDesc);
}
});
QuerySuppiler querySuppiler2 = new QuerySuppiler(userInfo.getHomeId(), "home", queryUtilsSupplier.get());
CompletableFuture<String> getHomeDesc = CompletableFuture.supplyAsync(querySuppiler2);
getHomeDesc.thenAccept(new Consumer<String>() { //--2 @Override
public void accept(String homeDesc) {
userInfo.setHomeDes(homeDesc);
}
});
QuerySuppiler querySuppiler3 = new QuerySuppiler(userInfo.getJobId(), "job", queryUtilsSupplier.get());
CompletableFuture<String> getJobDesc = CompletableFuture.supplyAsync(querySuppiler3);
getJobDesc.thenAccept(new Consumer<String>() { //--3 @Override
public void accept(String jobDesc) {
userInfo.setJobDes(jobDesc);
}
});
CompletableFuture<Void> getUserInfo = CompletableFuture.allOf(getCarDesc, getHomeDesc, getJobDesc);
getUserInfo.thenAccept(new Consumer<Void>() {
@Override
public void accept(Void result) {
long end = System.currentTimeMillis();
System.out.println("全部完成查询耗时="+(end - begin));
}
});
getUserInfo.join();
//--4
return userInfo;
} public static void main(String[] args) {
long begin = System.currentTimeMillis(); //多线程环境需要注意线程安全问题
List<UserInfo> userInfoList = Collections.synchronizedList(new ArrayList<>());
for (int i = 0; i <= 20; i++) {
UserInfo userInfo = new UserInfo();
userInfo.setId(i);
userInfo.setName("username" + i);
userInfo.setCarId(i);
userInfo.setJobId(i);
userInfo.setHomeId(i);
userInfoList.add(userInfo);
} //stream 查询一个用户花费3s 并行计算后一个用户1秒左右 查询21个用户花费21秒 //parallelStream 速度更慢
userInfoList.stream().map(userInfo -> {
QueryUserService queryUserService = new QueryUserService();
userInfo = queryUserService.converUserInfo(userInfo);
return userInfo;
}).collect(Collectors.toList());
System.out.println("=============");
long end = System.currentTimeMillis();
System.out.println(end - begin);
}
}
CompletableFuture--给future调用增加回调或聚合操作的更多相关文章
- [Effective JavaScript 笔记]第67条:绝不要同步地调用异步的回调函数
设想有downloadAsync函数的一种变种,它持有一个缓存(实现为一个Dict)来避免多次下载同一个文件.在文件已经被缓存的情况下,立即调用回调函数是最优选择. var cache=new Dic ...
- JS---封装缓动(变速)动画函数---增加任意多个属性&增加回调函数
封装缓动(变速)动画函数---增加任意多个属性&增加回调函数 回掉函数fn,在所有元素到达目的位置后,判断是否传入一个函数,有就调用 if(fn){fn()}; 这样一次点击,产生多个动画 & ...
- Python Django 协程报错,进程池、线程池与异步调用、回调机制
一.问题描述 在Django视图函数中,导入 gevent 模块 import gevent from gevent import monkey; monkey.patch_all() from ge ...
- NET中级课--浅谈委托,事件,异步调用,回调等概念
直接说题. 委托 首先明确它是什么,其实就是一个类,定义一个委托即定义一个类,那么它是什么类?用来说明方法的类型的类.字段有类型,那么方法其实也有类型,就是委托. 委托是某 ...
- DLL与EXE之间的通讯调用 以及 回调函数的线程执行空间
dll 与 exe 之间的通讯方式有很多种, 本文采用回调函数的方法实现, 本文也将研究多线程,多模块的情况下,回调函数所在的线程, 啥也不说了,先附上代码: 下面的是dll模块的的, dll的工程文 ...
- 并发编程 - 线程 - 1.线程queue/2.线程池进程池/3.异步调用与回调机制
1.线程queue :会有锁 q=queue.Queue(3) q.get() q.put() 先进先出 队列后进先出 堆栈优先级队列 """先进先出 队列"& ...
- setInterval调用ajax回调函数不执行的问题
setInterval调用ajax回调函数不执行 1.首先检查你的setInterval()函数写法是否正确 参考写法 // 检查是否支付成功 var isPayRequest=false; var ...
- Java调用和回调总结(2)
Java调用和回调总结(2) 调用的种类 调用有3种, 普通调用(同步调用), 异步调用, 异步回调. 三种调用的特点 普通调用: 也叫做同步调用 , 最常见的调用, 会造成阻塞. 异步调用 : 异步 ...
- C# 同步调用 异步调用 异步回调 多线程的作用
同步调用 : 委托的Invoke方法用来进行同步调用.同步调用也可以叫阻塞调用,它将阻塞当前线程,然后执行调用,调用完毕后再继续向下进行. 异步调用 :同步调用会阻塞线程,如果是要调用一项繁重的 ...
随机推荐
- ng-组件
几乎所有前端框架都在玩"组件化",而且最近都不约而同地选择了"标签化"这种思路,Angular 也不例外. 对新版本的 Angular 来说,一切都是围绕着&q ...
- 常见sql注入的类型
这里只讲解sql注入漏洞的基本类型,代码分析将放在另外一篇帖子讲解 目录 最基础的注入-union注入攻击 Boolean注入攻击-布尔盲注 报错注入攻击 时间注入攻击-时间盲注 堆叠查询注入攻击 二 ...
- PWA - service worker - Workbox(未完)
Get Started(开始) 只有get请求才能cache缓存吗? Create and Register a Service Worker File(创建和注册 Service Worker) B ...
- MarkDown图文编辑系列教程(二)
一.写在前面 引言 本文是我写的MarkDown系列教程的第二篇,前一篇的地址:MarkDown图文编辑系列教程(一) 读完本篇,你将获得 学会使用markdown语法进行:区块引用(一种常用的引用格 ...
- liunx 查找locate
使用 安装 yum install mlocate 更新数据库 updatedb 查找my.cnf文件 locate my.cnf
- 爬虫学习笔记2requests库和beautifulsoup4库学习笔记
目录 1.requests库 1.1 安装 2.beautifulsoup4 2.1 常用方法 2.2 bs4 中四大对象种类 2.3 遍历文档树 2.4 搜索文档树 查询id=head的Tag 查询 ...
- 链表问题----删除倒数第K个节点
在单链表和双链表中删除倒数第K个节点 分别实现两个函数,一个可以删除单链表中的倒数第K个节点,一个可以删除双链表中的倒数第k 个节点,要求时间复杂度是 O(N),空间复杂度是 O(1). [解析] 基 ...
- SVM-支持向量机(一)线性SVM分类
SVM-支持向量机 SVM(Support Vector Machine)-支持向量机,是一个功能非常强大的机器学习模型,可以处理线性与非线性的分类.回归,甚至是异常检测.它也是机器学习中非常热门的算 ...
- 查看Sql Server库中某张表的结构
--快速查看表结构(比较全面的) SELECT CASE WHEN col.colorder = THEN obj.name ELSE '' END AS 表名, col.colorder AS 序号 ...
- CSS一些特殊图形
CSS一些特殊图形 CSS绘制三角形 通过控制元素的border属性可以实现三角形效果; 首先来设置4个边框, 为50px solid [color] color设置成不同的颜色值看一下效果 < ...