使用CompletableFuture多线程异步任务优化查询接口性能

一、需求:文书报告接口信息内容过多,涉及几十张表,十多个接口 由于积木报表是串行执行接口响应时间过长需要优化,而各个接口之间无顺序要求
1、创建异步任务
(1)supplyAsync介绍
supplyAsync是创建带有返回值的异步任务

  //带返回值的异步请求,默认线程池public static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier) {return asyncSupplyStage(asyncPool, supplier);
}
//带返回值的异步请求,自定义线程池
public static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier,  Executor executor) {return asyncSupplyStage(screenExecutor(executor), supplier);
}

(2)示例如下:不同任务之间没有顺序关系的任务

  CompletableFuture<List<Order>> future1 = CompletableFuture.supplyAsync(() -> findOrder(id));CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> getStr(id));CompletableFuture<Map<String,Object>> future3 = CompletableFuture.supplyAsync(() -> getMap(id));CompletableFuture<Integer> future4 = CompletableFuture.supplyAsync(() -> getInte(id));

2、等待所有任务完成,获取结果然后封装返回
(1)allOf介绍

	CompletableFuture中多个任务都执行完成后才会执行,只有有一个任务执行异常,则返回的CompletableFuture执行get方法时会抛出异常,如果都是正常执行,则get返回null

(2)示例如下:

CompletableFuture<Void> allFutures = CompletableFuture.allOf(future1,future2,future3,future4);try {allFutures.get();   // 等待所有任务完成List<Order> result1 = future1.join(); // 获取第一个任务的结果String result2 = future2.join();Map<String,Object> result3=future3.join();Integer result4  =future4.join();String finalResult = result1 + " " + result2+ " " + result3+ " " + result4;System.out.println("最后封装结果: " + finalResult);} catch (InterruptedException | ExecutionException e) {e.printStackTrace();}

3、测试代码(完整版)如下

public class CompletableFutureTest {public static void main(String[] args) {String id="xxx";CompletableFuture<List<Order>> future1 = CompletableFuture.supplyAsync(() -> findOrder(id));CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> getStr(id));CompletableFuture<Map<String,Object>> future3 = CompletableFuture.supplyAsync(() -> getMap(id));CompletableFuture<Integer> future4 = CompletableFuture.supplyAsync(() -> getInte(id));CompletableFuture<Void> allFutures = CompletableFuture.allOf(future1,future2,future3,future4);try {allFutures.get();   // 等待所有任务完成List<Order> result1 = future1.join(); // 获取第一个任务的结果String result2 = future2.join();Map<String,Object> result3=future3.join();Integer result4  =future4.join();String finalResult = result1 + " " + result2+ " " + result3+ " " + result4;System.out.println("Final Result: " + finalResult);} catch (InterruptedException | ExecutionException e) {e.printStackTrace();}}public static List<Order> findOrder(String id){System.out.println("执行future1:findOrder方法----------------");try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}return new ArrayList<>();}public static String getStr(String id){System.out.println("执行future2:getStr----------------");try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}return "new ArrayList<>()";}public static Map<String,Object> getMap(String id){System.out.println("执行future3:getMap----------------");return null;}public static Integer getInte(String id){System.out.println("执行future4:getInte----------------");return null;}
}

4、总结
在这个示例中,使用了 CompletableFuture.supplyAsync() 方法创建4个返回值不同的 CompletableFuture,分别从不同的方法中获取数据。然后,使用 CompletableFuture.allOf()allFutures.get()方法等待所有 CompletableFuture 完成并确认是否有方法异常。之后,通过调用 CompletableFuture.join() 方法来获取各个 CompletableFuture 的结果,并进行结果的组装。

需要注意的是,allFutures.get() 是一个阻塞调用,将等待所有 CompletableFuture 完成。所以要确保在调用 get() 方法之前已经创建了所有的 CompletableFuture。

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

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

相关文章

Ingress典型配置

Ingress 是 Kubernetes 中用于管理 HTTP 和 HTTPS 路由的资源。以下是一个典型的 Ingress 配置示例&#xff0c;用于将流量引导到两个不同的服务&#xff1a; apiVersion: networking.k8s.io/v1 kind: Ingress metadata:name: example-ingress spec:rules:- host: example.com…

力扣第1005题 K 次取反后最大化的数组和 c++ 贪心 双思维

题目 1005. K 次取反后最大化的数组和 简单 相关标签 贪心 数组 排序 给你一个整数数组 nums 和一个整数 k &#xff0c;按以下方法修改该数组&#xff1a; 选择某个下标 i 并将 nums[i] 替换为 -nums[i] 。 重复这个过程恰好 k 次。可以多次选择同一个下标 i 。 以…

创建Secret(使用kubectl)

创建Secret&#xff08;使用kubectl&#xff09; 假设某个 Pod 需要访问数据库。在您执行 kubectl 命令所在机器的当前目录&#xff0c;创建文件 ./username.txt 文件和 ./password.txt 暂存数据库的用户名和密码&#xff0c;后续我们根据这两个文件配置 kubernetes secrets。…

asp.net乡村旅游管理系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio

一、源码特点 asp.net乡村旅游管理系统是一套完善的web设计管理系统系统&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为vs2010&#xff0c;数据库为sqlserver2008&#xff0c;使用c# 语言开发 asp.net乡村旅游管理系统 二、…

【在英伟达nvidia的jetson-orin-nx和PC电脑ubuntu20.04上-装配ESP32开发调试环境-基础测试】

【在英伟达nvidia的jetson-orin-nx和PC电脑ubuntu20.04上-装配ESP32开发调试环境-基础测试】 1、概述2、实验环境3、 物品说明4、参考资料与自我总结5、实验过程1、创建目录2、克隆下载文件3、 拉取子目录安装和交叉编译工具链等其他工具4、添加环境变量6、将样例文件拷贝到桌面…

SQL比较两次的字段集合,找出并返回差异,主要用于更新记录事件

Create PROCEDURE [dbo].[SysGetTableFieldsCompare] -- Description: <比较两次的字段集合&#xff0c;找出并返回差异&#xff0c;主要用于更新记录事件> -- Return 0- 成功&#xff0c; -1- 没有这个表 -- Rev: 1.00 -- FieldsSource Nvarchar(max) , FieldsTarg…

【分布式技术专题】「分布式技术架构」MySQL数据同步到Elasticsearch之N种方案解析,实现高效数据同步

MySQL数据同步到Elasticsearch之N种方案解析&#xff0c;实现高效数据同步 前提介绍MySQL和ElasticSearch的同步双写优点缺点针对于缺点补充优化方案 MySQL和ElasticSearch的异步双写优点缺点 定时延时写入ElasticSearch数据库机制优点缺点 开源和成熟的数据迁移工具选型Logsta…

软考系列(系统架构师)- 2016年系统架构师软考案例分析考点

试题一 软件架构&#xff08;质量属性、架构风格对比、根据描述填空&#xff09; 试题二 系统开发&#xff08;用例图参与者、用例关系、类图关系&#xff09; 学生、教师、管理员、时间、打印机【问题2】&#xff08;7分&#xff09; 用例是对系统行为的动态描述&#xff0c;用…

ant框架下 a-input-number组件的宽度问题

如图所示&#xff0c;在使用a-input-number组件时虽然设置了宽度但是没有生效&#xff0c;加上了一个!important就好了&#xff1a;

【Java 进阶篇】使用 Java 和 Jsoup 进行 XML 处理

XML&#xff08;可扩展标记语言&#xff09;是一种常用的数据交换格式&#xff0c;它被广泛用于在不同系统之间传递和存储数据。Java作为一种强大的编程语言&#xff0c;提供了多种方式来处理XML数据。其中&#xff0c;Jsoup 是一个流行的Java库&#xff0c;用于解析和操作XML文…

Leetcode—2678.老人的数目【简单】

2023每日刷题&#xff08;八&#xff09; Leetcode—2678.老人的数目 int countSeniors(char ** details, int detailsSize){ int ans 0; int i; int tens 0; int ones 0; for(i 0; i < detailsSize; i) { tens ((details i) 11) - ‘0’; ones ((details i) 12)…

FOC系列(一)----DRV8301芯片的学习

一、 写在前面 从今年四五月份一直就想玩个无刷直流电机&#xff08;BLDC&#xff09;&#xff0c;但是碍于一直没时间。其实很早就做出来了测试板的控制板&#xff0c;可以当做开发板使用&#xff0c;考虑到成本问题&#xff0c;最后选用STM32F103CBT6芯片&#xff0c;下面是很…

Hadoop核心机制详细解析

Hadoop核心机制详细解析 Hadoop的核心机制是通过HDFS文件系统和MapReduce算法进行存储资源、内存和程序的有效利用与管理。在现实的实例中&#xff0c;通过Hadoop&#xff0c;可以轻易的将多台普通的或低性能的服务器组合成分布式的运算-存储集群&#xff0c;提供大数据量的存…

Python爬虫网易云音乐,Tkinter制作音乐播放器

目录 一、效果展示 二、环境 三、实现过程 四、源码 一、效果展示 页面的美化以及功能还有待升级~ 先来说一下已有功能吧&#xff1a; 可以在搜索框中通过歌曲或歌手名称进行搜索&#xff0c;效果和在网易云官网搜索一样。 点击开始下载&#xff0c;就会将搜索结果的第一…

关于语雀 23 日故障的公告

10 月 23 日语雀出现重大服务故障&#xff0c;且持续 7 个多小时才完全恢复&#xff0c;给用户使用造成极大不便&#xff0c;对此我们深感抱歉。经过复盘&#xff0c;我们在这里向大家进一步说明故障原因、修复过程和改进措施。 故障原因及处理过程&#xff1a; 10 月 23 日下…

xshell+xming显示jmeter的gui页面

1.下载和安装xming&#xff0c;下载地址&#xff1a;https://sourceforge.net/projects/xming/ 2.配置xming 记住这个端口&#xff0c;一会要用到 修改进入xming安装目录修改host文件 此处是远程服务器的ip 3.服务器执行vi /etc/ssh/sshd_config&#xff0c;修改成如图所示…

Class类文件中的“咖啡宝贝”

Class文件是一组以8个字节为基础单位的二进制流&#xff0c;各个数据项目严格按照顺序紧凑地排列在文件之中&#xff0c;中间没有添加任何分隔符&#xff0c;整个Class文件中存储的内容几乎全部是程序运行的必要数据&#xff0c;没有空隙存在。 字节码&#xff08;Byte Code&am…

力扣第134题 加油站 c++ 暴力 + 贪心

题目 134. 加油站 中等 相关标签 贪心 数组 在一条环路上有 n 个加油站&#xff0c;其中第 i 个加油站有汽油 gas[i] 升。 你有一辆油箱容量无限的的汽车&#xff0c;从第 i 个加油站开往第 i1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发&#xff0c;…

Mybit-Plus

1.MyBatis-Plus的代码生成器快速生成后端代码 实体类 持久层代码 注意&#xff1a;mapper接口都继承于BaseMapper 服务层代码 注意&#xff1a;service接口都继承于IService&#xff0c;service实现类都继承ServiceImpl 控制层代码 注意&#xff1a;只有类&a…

SpringAOP源码解析之advice构建排序(二)

上一章我们知道Spring开启AOP之后会注册AnnotationAwareAspectJAutoProxyCreator类的定义信息&#xff0c;所以在属性注入之后initializeBean的applyBeanPostProcessorsAfterInitialization方法执行的时候调用AnnotationAwareAspectJAutoProxyCreator父类(AbstractAutoProxyCre…