JAVA代码优化:CompletableFuture(异步编程解决方案)

server层代码需要查询四个sql语句,但全都由主线程执行。

CompletableFuture可以分出多个子线程执行

CompletableFuture(并行处理多个异步任务)

1.通过CompletableFuture.supplyAsync()方法创建了三个CompletableFuture实例,分别代表异步任务a、b和c。每个CompletableFuture都使用了一个Lambda表达式来定义具体的任务逻辑,并返回一个结果。

2.通过CompletableFuture.allOf()方法将这三个CompletableFuture实例组合在一起,表示在所有任务完成后进行下一步操作。allOf()方法接收可变参数,可以传入任意数量的CompletableFuture实例。

3.在调用allOf()方法后,可以使用join()方法等待所有任务完成。join()方法会阻塞当前线程,直到所有任务都完成。

4.通过调用CompletableFuture的get()方法获取各个任务的结果。get()方法也是一个阻塞调用,它会等待对应的CompletableFuture完成并返回结果。

(a、b和c分别表示任务aFuture、bFuture和cFuture的结果。)

注意:如果某个CompletableFuture发生异常,get()方法会抛出ExecutionException异常。你可以使用try-catch块来处理异常情况。另外,如果某个CompletableFuture还没有完成,get()方法也会阻塞等待其完成。可以使用isDone()方法来判断CompletableFuture是否已完成。

var aFuture = CompletableFuture.supplyAsync(()->{//.....return xxx;});var bFuture = CompletableFuture.supplyAsync(()->{//.....return xxx;});var cFuture = CompletableFuture.supplyAsync(()->{//.....return xxx;});//并行处理CompletableFuture//allOf等待的参数.allOf(aFuture,bFuture,cFuture)//join等待子线程执行.join();//取值var a= aFuture.get();var b= bFuture.get();var c= cFuture.get();

原代码:

/*** 获取首页基本数据* @param beginCreateTime* @param endCreateTime* @return*/@Overridepublic IndexBaseInfoVO getBaseInfo(String beginCreateTime, String endCreateTime) {//1)构建一个空的结果集对象IndexBaseInfoVO result = new IndexBaseInfoVO();//2 封装结果集属性// 2.1 由于查询需要用到用户名 调用工具类获取用户名String username = SecurityUtils.getUsername();try {//3 封装结果集对象result.setCluesNum(reportMpper.getCluesNum(beginCreateTime, endCreateTime, username));result.setBusinessNum(reportMpper.getBusinessNum(beginCreateTime, endCreateTime, username));result.setContractNum(reportMpper.getContractNum(beginCreateTime, endCreateTime, username));result.setSalesAmount(reportMpper.getSalesAmount(beginCreateTime, endCreateTime, username));}catch (Exception e) {e.printStackTrace();return null;}//4 返回结果集对象return result;}

修改后的代码:

/*** 获取首页基本数据* @param beginCreateTime* @param endCreateTime* @return*/
@Override
public IndexBaseInfoVO getBaseInfo(String beginCreateTime, String endCreateTime) {//1)构建一个空的结果集对象IndexBaseInfoVO result = new IndexBaseInfoVO();//2 封装结果集属性// 2.1 由于查询需要用到用户名 调用工具类获取用户名String username = SecurityUtils.getUsername();try {CompletableFuture<Integer> clueNums = CompletableFuture.supplyAsync(()->{// 2.2 开始查询第一个属性 线索数量return reportMpper.getCluesNum(beginCreateTime, endCreateTime, username);});CompletableFuture<Integer> bussinessNum = CompletableFuture.supplyAsync(()->{// 2.3 开始查询第一个属性 商机数量return reportMpper.getBusinessNum(beginCreateTime, endCreateTime, username);});CompletableFuture<Integer> contractNum = CompletableFuture.supplyAsync(()->{// 2.4 开始查询第一个属性 合同数量return reportMpper.getContractNum(beginCreateTime, endCreateTime, username);});CompletableFuture<Double> saleAmount = CompletableFuture.supplyAsync(()->{// 2.5 开始查询第一个属性 销售金额数量return reportMpper.getSalesAmount(beginCreateTime, endCreateTime, username);});//3 join等待所有线程全部执行完成CompletableFuture.allOf(clueNums,bussinessNum,contractNum,saleAmount).join();//4 封装结果集对象result.setCluesNum(clueNums.get());result.setBusinessNum(bussinessNum.get());result.setContractNum(contractNum.get());result.setSalesAmount(saleAmount.get());}catch (Exception e) {e.printStackTrace();return null;}//5 返回结果集对象return result;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/192712.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PTA结构体经典编程题

目录 第一题&#xff1a;计算平均成绩 第二题&#xff1a;平面向量加法 第三题&#xff1a;查找书籍 第四题&#xff1a;通讯录排序 第五题&#xff1a;计算职工工资 第一题&#xff1a;计算平均成绩 思路&#xff1a;看到一个学生的基本信息&#xff0c;所以定义一个结构…

神经网络模型预训练

根据神经网络各个层的计算逻辑用程序实现相关的计算&#xff0c;主要是&#xff1a;前向传播计算、反向传播计算、损失计算、精确度计算等&#xff0c;并提供保存超参数到文件中。 # coding: utf-8 import sys, os sys.path.append(os.pardir) # 为了导入父目录的文件而进行的…

【Python百练——第3练】矩形类及操作

&#x1f490;作者&#xff1a;insist-- &#x1f490;个人主页&#xff1a;insist-- 的个人主页 理想主义的花&#xff0c;最终会盛开在浪漫主义的土壤里&#xff0c;我们的热情永远不会熄灭&#xff0c;在现实平凡中&#xff0c;我们终将上岸&#xff0c;阳光万里 ❤️欢迎点…

OracleRac跨网段修改Public IP/VIP/Private IP/Scan IP

本验证于测试环境&#xff0c;生产操作需谨慎 现为测试环境&#xff0c;机器有且仅有两个网卡存在&#xff0c;需求修改Public IP/VIP/Private IP/Scan IP&#xff0c;把Public IP/VIP/Scan IP的网段改为Private IP的网段&#xff0c;Private IP于Public IP网段互换。 先停掉两…

Golang 原生Rpc Server实现

Golang 原生Rpc Server实现 引言源码解析服务端数据结构服务注册请求处理 客户端数据结构建立连接请求调用 延伸异步调用定制服务名采用TPC协议建立连接自定义编码格式自定义服务器 参考 引言 本文我们来看看golang原生rpc库的实现 , 首先来看一下golang rpc库的demo案例: 服…

python的制图

测试数据示例&#xff1a; day report_user_cnt report_user_cnt_2 label 2023-10-01 3 3 欺诈 2023-10-02 2 4 欺诈 2023-10-03 6 5 欺诈 2023-10-04 2 1 正常 2023-10-05 4 3 正常 2023-10-06 4 4 正常 2023-10-07 2 6 正常 2023-10-08 3 7 正常 2023-10-09 3 12 正常 2023-…

C#学习 - 事件 续

事件声明 完整声明 using System;namespace ConsoleApp1 {internal class Program{static void Main(string[] args){Customer customer new Customer();Waiter waiter new Waiter();customer.Order waiter.Action;customer.Action();//这里也能直接写MyOrdercustomer.Pay…

python爬虫之创建属于自己的ip代理池

在后续需求数据量比较大的情况下&#xff0c;自建一个ip代理池可以帮助我们获得更多的数据。 下面我来介绍一下整个过程 1.找到目标代理网站 https://www.dailiservers.com/go/webshare https://proxyscrape.com/ https://spys.one/ https://free-proxy-list.net/ http://fr…

找不到DNS地址的解决方案

找不到DNS地址的解决方案 第一种解决方案&#xff1a;刷新DNS缓存第二种解决方案&#xff1a; 配置Internet协议版本4&#xff08;TCP/IPv4&#xff09;配置IP地址配置DNS地址 如何查看本机IPv4地址、子网掩码与默认网关 第一种解决方案&#xff1a;刷新DNS缓存 WINR输入cmd回…

基于SSH三大框架的员工管理系统

基于SSH三大框架的员工管理系统 摘要 本系统为本人学习SSH三大框架时所做的整合实例&#xff0c;系统角色包括普通用户和管理员两种&#xff0c;首页有管理员登录入口链接。系统功能主要包括管理员对用户的基本增、删、改、查和分页显示用户信息等。 系统环境 本系统使用ec…

【C++练级之路】【Lv.1】C++,启动!(命名空间,缺省参数,函数重载,引用,内联函数,auto,范围for,nullptr)

目录 引言入门须知一、命名空间1.1 作用域限定符1.2 命名空间的意义1.3 命名空间的定义1.4 命名空间的使用 二、C输入&输出2.1 cout输出2.2 cin输入2.3 std命名空间的使用惯例 三、缺省参数3.1 缺省参数概念3.2 缺省参数分类 四、函数重载4.1 函数重载概念4.2 函数重载分类…

BUUCTF 间谍启示录 1

BUUCTF:https://buuoj.cn/challenges 题目描述&#xff1a; 在城际公路的小道上&#xff0c;罪犯G正在被警方追赶。警官X眼看他正要逃脱&#xff0c;于是不得已开枪击中了罪犯G。罪犯G情急之下将一个物体抛到了前方湍急的河流中&#xff0c;便头一歪突然倒地。警官X接近一看&…

公平锁和非公平锁以及他们的实现原理是什么

文章目录 什么是非公平锁和公平锁呢&#xff1f;我们来看看acquire(1)的源码如下&#xff1a;这里的判断条件主要做两件事&#xff1a;在tryAcquire()方法中&#xff0c;主要是做了以下几件事&#xff1a;公平锁的tryAcquire()&#xff0c;实现的原理图如下&#xff1a;我们来看…

ORA-00257: archiver error. Connect internal only, until freed 的解决方法

归档文件存储空间不足&#xff0c;导致出现该问题。 当我们将数据库的模式修改为归档模式的时候&#xff0c;如果没有指定归档目录&#xff0c;默认的归档文件就会放到Flash Recovery Area的目录&#xff0c;但是这个目录是有大小限制的&#xff0c;如果超过了这个大小&#x…

C#基础学习--命名空间和程序集

引用其他程序集 编译器接受源代码文件并生成一个名为程序集的输出文件。 在许多项目中&#xff0c;会想使用来自其他程序集的类或类型。这些程序集可能来自BCL或第三方供应商&#xff0c;或者自己创建的。这些程序集称为类库&#xff0c;而且它们的程序集文件的名称通常以dll…

微信小程序组件与插件有啥区别?怎么用?

目录 一、微信小程序介绍 二、微信小程序组件 三、微信小程序插件 四、微信小程序组件与插件有啥区别 一、微信小程序介绍 微信小程序是一种基于微信平台的应用程序&#xff0c;它可以在微信客户端内直接运行&#xff0c;无需下载和安装。微信小程序具有轻量、便捷、跨平台…

对比ProtoBuf和JSON的序列化和反序列化能力

1.序列化能力对比验证 在这里让我们分别使用PB与JSON的序列化与反序列化能力&#xff0c;对值完全相同的一份结构化数据进行不同次数的性能测试。 为了可读性&#xff0c;下面这一份文本使用JSON格式展示了需要被进行测试的结构化数据内容: {"age" : 20,"name…

线程安全的问题以及解决方案

线程安全 线程安全的定义 线程安全:某个代码无论是在单线程上运行还是在多线程上运行,都不会产生bug. 线程不安全:单线程上运行正常,多线程上运行会产生bug. 观察线程不安全 看看下面的代码: public class ThreadTest1 {public static int count 0;public static void main…

数据结构和算法-树与二叉树的存储结构以及树和二叉树和森林的遍历

文章目录 二叉树的存储结构二叉树的顺序存储二叉树的链式存储小结 二叉树的先中后序遍历例题小结 二叉树的层次遍历小结 由遍历序列构造二叉树一个遍历序列即使给定了前中后序&#xff0c;也不能确定该二叉树的形态可以确定的序列组合前序中序后序中序层序中序 小结若前序&…

算力基础设施领域国家标准发布

2023 年 11 月 27 日&#xff0c;国家标准 GB/T 43331-2023《互联网数据中心&#xff08;IDC&#xff09;技术和分级要求》正式发布。这一国家标准由中国信息通信研究院&#xff08;简称“中国信通院”&#xff09;联合多家企事业单位编制&#xff0c;旨在满足当前国家算力基础…