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方法用来进行同步调用.同步调用也可以叫阻塞调用,它将阻塞当前线程,然后执行调用,调用完毕后再继续向下进行. 异步调用 :同步调用会阻塞线程,如果是要调用一项繁重的 ...
随机推荐
- 微信小程序--骰子游戏
寒假老师让制作一个小程序,于是开始学习如何制作微信小程序. 第一步,拥有一个小程序帐号, 在这个小程序管理平台,你可以管理你的小程序的权限,查看数据报表,发布小程序等操作. 我用的是微信web开发工具 ...
- openlayers按坐标点播放
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- gulp常用插件之gulp-load-plugins使用
更多gulp常用插件使用请访问:gulp常用插件汇总 gulp-load-plugins这是一款批量引入package.json文件中的依赖项工具. 更多使用文档请点击访问gulp-load-plug ...
- 为什么MYSQL分页时使用limit+ order by会出现数据重复问题
问题描述: MYSQL采用limit进行翻页查询时,搭配order by ,在翻到第二页的时候可能会出现第一页的数据, 示例sql如下: select a,b from c where d = ' ...
- pythonCSV内置模块应用
一.Python内置模块CSV CSV,即逗号分隔值(也称字符分隔值,因为分隔符可以不是逗号),是一种常用的文本格式,用以存储表格数据,包括数字或者字符.如下图所示: CSV类似于Excel格式 很多 ...
- linux c++调试日志函数
#ifndef MYLOG_H #define MYLOG_H #include <stdio.h> #define __DEBUG__ #ifdef __DEBUG__ #define ...
- C++ const char *返回值问题
今天写代码,遇到一个const char *返回值的问题,记录一下 问题场景:我写了一个动态库,有个函数声明如下: ; 函数定义如下: const char * HttpRequestImpl::RG ...
- 《图解HTTP》笔记
web网络基础 概述 Web是建立在HTTP(超文本传输协议)上通信的 通常使用的网络(包括互联网)是在TCP/IP基础上运作的,HTTP属于它的内部子集 TCP/IP协议 协议族 计算机与网络设备要 ...
- C#使用OracleBulkCopy
首先使用PL/SQL 通过语句:select * from v$version; 查询出使用的oracle版本,弄到对应版本的Oracle.DataAccess.DLL 我本地使用版本为:11.2. ...
- jQuery---京东轮播图
京东轮播图 有个计数的,点右边,计数增加,判断计数是否超过总的长度,超过设置计数为0,再设置当前的图片动画,兄弟的图片动画 左边点击同理,计数是--,判断计数是否等于-1,等于则reset计数为总长度 ...