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调用增加回调或聚合操作的更多相关文章

  1. [Effective JavaScript 笔记]第67条:绝不要同步地调用异步的回调函数

    设想有downloadAsync函数的一种变种,它持有一个缓存(实现为一个Dict)来避免多次下载同一个文件.在文件已经被缓存的情况下,立即调用回调函数是最优选择. var cache=new Dic ...

  2. JS---封装缓动(变速)动画函数---增加任意多个属性&增加回调函数

    封装缓动(变速)动画函数---增加任意多个属性&增加回调函数 回掉函数fn,在所有元素到达目的位置后,判断是否传入一个函数,有就调用 if(fn){fn()}; 这样一次点击,产生多个动画 & ...

  3. Python Django 协程报错,进程池、线程池与异步调用、回调机制

    一.问题描述 在Django视图函数中,导入 gevent 模块 import gevent from gevent import monkey; monkey.patch_all() from ge ...

  4. NET中级课--浅谈委托,事件,异步调用,回调等概念

    直接说题. 委托         首先明确它是什么,其实就是一个类,定义一个委托即定义一个类,那么它是什么类?用来说明方法的类型的类.字段有类型,那么方法其实也有类型,就是委托.       委托是某 ...

  5. DLL与EXE之间的通讯调用 以及 回调函数的线程执行空间

    dll 与 exe 之间的通讯方式有很多种, 本文采用回调函数的方法实现, 本文也将研究多线程,多模块的情况下,回调函数所在的线程, 啥也不说了,先附上代码: 下面的是dll模块的的, dll的工程文 ...

  6. 并发编程 - 线程 - 1.线程queue/2.线程池进程池/3.异步调用与回调机制

    1.线程queue :会有锁 q=queue.Queue(3) q.get() q.put() 先进先出 队列后进先出 堆栈优先级队列 """先进先出 队列"& ...

  7. setInterval调用ajax回调函数不执行的问题

    setInterval调用ajax回调函数不执行 1.首先检查你的setInterval()函数写法是否正确 参考写法 // 检查是否支付成功 var isPayRequest=false; var ...

  8. Java调用和回调总结(2)

    Java调用和回调总结(2) 调用的种类 调用有3种, 普通调用(同步调用), 异步调用, 异步回调. 三种调用的特点 普通调用: 也叫做同步调用 , 最常见的调用, 会造成阻塞. 异步调用 : 异步 ...

  9. C# 同步调用 异步调用 异步回调 多线程的作用

    同步调用   : 委托的Invoke方法用来进行同步调用.同步调用也可以叫阻塞调用,它将阻塞当前线程,然后执行调用,调用完毕后再继续向下进行. 异步调用  :同步调用会阻塞线程,如果是要调用一项繁重的 ...

随机推荐

  1. ECMAScript基本对象——Math数学对象

    1.创建 不用创建直接使用.直接Math.方法名(): 2.方法 ①random():返回0.0-1.0的随机数,左闭有开 区间有开区间和闭区间,其中又分为全开区间( ),全闭区间[ ],左开右闭区间 ...

  2. [NOI2003]文本编辑器 [Fhq Treap]

    [NOI2003]文本编辑器 没啥好说的 就是个板子 #include <bits/stdc++.h> // #define int long long #define rep(a , b ...

  3. cf 989C

    构造一个网格图使得四种类型的联通分量分别有a,b,c,d 看图就知道应该如何去构造了 int gird[maxn][maxn]; int main(){ int a[4]; for(int i=0;i ...

  4. 布隆过滤器--guava实现

    private static int size = 1000000;//预计要插入多少数据 private static double fpp = 0.01;//期望的误判率 private stat ...

  5. HTML-入门

    HTML——超文本标记语言(Hyper Text Markup Language)html——W3C制定的标准超文本——除了文本,还有图片.视频.音频等丰富的元素标记(标签)——用来展示内容表型:标签 ...

  6. Cenos7 学习笔记

    一.nmtui nmtui——Text User Interface for controlling NetworkManager,这是一个NetworkManager服务的网卡接口配置工具,能实现在 ...

  7. 《深入理解java虚拟机》读书笔记八——第九章

    第九章 类加载及执行子系统的案例与实战 Q:如果有10个WEB应用程序都是用Spring来进行组织管理的话,可以把Spring放到Common或Shared目录下(Tomcat5.0)让这些程序共享. ...

  8. 【你不知道的javaScript 上卷 笔记6】javaScript中的对象相关内容

    一.创建一个对象的语法 var myObj = { key: value // ... };//字面量 var myObj = new Object(); //new myObj.key = valu ...

  9. [ZJOI2009] 狼与羊的故事 - 最小割

    给定一个\(N \times M\)方格矩阵,每个格子可在\(0,1,2\)中取值.要求在方格的边上进行划分,使得任意联通块内不同时包含\(1\)和\(2\)的格子. ________________ ...

  10. 在npm上如何发布自己的包

    环境需要:node和npm 然后在本地建一个文件夹作为你要发布的模块 然后在这个文件夹下打开cmd 执行:npm init 按照提示写对应的,或者先不写也可以,最后y 这时候在mcrm这个文件夹下就出 ...