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. Python学习笔记一:变量、函数

    变量.函数是Python语言的最基本单元,下面是我作为初学者的当前理解,随着学习的深入今后会做刷新. 变量:表示操作对象是谁. 变量的方法:表示能做什么事情. 如何设计变量:先分析需要解决的问题,基于 ...

  2. ABS与PC材质

    PC材料和ABS材料都是最常用的塑料材质,它们在材质.价格.性能上都有不同点. (一)PC材料 优点:PC是一种综合性能优良的非晶型热塑性树脂,具有优异的电绝缘性.延伸性.尺寸稳定性及耐化学腐蚀性,较 ...

  3. ubuntu set up 7 - power

    https://askubuntu.com/questions/1078939/ubuntu-18-04-battery-life http://tipsonubuntu.com/2018/11/18 ...

  4. AMC Problems and Solutions

    AMC Problems and Solutions:https://artofproblemsolving.com/wiki/index.php/AMC_Problems_and_Solutions ...

  5. PAT (Basic Level) Practice (中文)1021 个位数统计 (15 分)

    给定一个 k 位整数 1 (0, ,, d​k−1​​>0),请编写程序统计每种不同的个位数字出现的次数.例如:给定 0,则有 2 个 0,3 个 1,和 1 个 3. 输入格式: 每个输入包含 ...

  6. jQuery---tab栏切换

    tab栏切换 <!DOCTYPE html> <html> <head lang="en"> <meta charset="UT ...

  7. pycharm+anaconda在Mac上的配置方法 2019.11.29

    内心os: 听人说,写blog是加分项,那他就不是浪费时间的事儿了呗 毕竟自己菜还是留下来东西来自己欣赏吧 Mac小电脑上进行python数据开发环境的配置 首先下载Anaconda,一个超好用的数据 ...

  8. R语言函数化编程笔记2

    R语言函数化编程笔记2 我学过很多的编程语言,可以我写的代码很啰嗦,一定是我太懒了.或许是基础不牢地动山摇 1.为什么要学函数 函数可以简化编程语言,减少重复代码或者说面向对象的作用 2.函数 2.1 ...

  9. nginx 简单理解和配置

    1.概念 Nginx是一个高性能的HTTP和反向代理的web服务器,同时也提供了IMAP/POP3/SMTP服务,Nginx是由伊戈尔·塞索耶夫为俄罗斯访问量第二的Rambler.ru站点开发的,第一 ...

  10. nginx中部署前端,后端打成jar包运行

    项目是前后端分离:前端用vue开发,后端用的是springboot开发 会产生跨域问题,故在前端里用了代理 1.本前端项目是用vue开发: 1.1打包:终端 vscode快捷键:crtl+~  然后n ...