【Java高级】通过CompletableFuture类异步、并行获取数据库数据

1. CompletableFuture类简介

CompletableFuture 类是 Java 中用于异步编程和处理异步任务的工具类。它是 Java 8 引入的一部分,提供了一种方便的方式来处理异步操作,例如并行执行多个任务、等待多个任务完成等。

CompletableFuture 可以通过 runAsync 或者 supplyAsync 方法异步执行一个任务,使得任务在独立的线程中执行,而不会阻塞主线程。这两方法的区别在于任务是否有返回值

CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {// 异步执行的任务baseMapper.selectAll()
});
CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {// 异步执行的任务,产生一个整数结果return 42;
});

使用 CompletableFuture.allOf 方法等待多个 CompletableFuture 全部完成

CompletableFuture<Void> allOfFuture = CompletableFuture.allOf(future1, future2, future3);
allOfFuture.join(); // 阻塞等待所有任务完成

2. CompletableFuture类用法举例

为了避免异常处理的操作,推荐使用runAsync方法,考虑到方法内的任务没有返回值,可以在外部定义一个对象,用来保存任务得到的数据。

① 定义外部对象用来接收任务的输出

List<PowerUsageTopTenUserDTO> topTenSharpPowerList = new ArrayList<>();
List<PowerUsageTopTenUserDTO> topTenPeakPowerList = new ArrayList<>();

② 异步执行任务,调用runAsync方法,使用allOf方法等待多个CompletableFuture全部完成

CompletableFuture<Void> sharpFuture = CompletableFuture.runAsync(() ->topTenSharpPowerList.addAll(baseMapper.getTopTenSharpPowerList(businessUnitId, startTime, endTime, powerConsumerIdList)), peakFlatValleyPeriodExecutor);
CompletableFuture<Void> peakFuture = CompletableFuture.runAsync(() ->topTenPeakPowerList.addAll(baseMapper.getTopTenPeakPowerList(businessUnitId, startTime, endTime, powerConsumerIdList)), peakFlatValleyPeriodExecutor);
CompletableFuture.allOf(sharpFuture, peakFuture).join();                    

③ 后续对数据继续进行处理

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

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

相关文章

【Java 数据结构】对象的比较

Java中对象的比较 1. PriorityQueue中插入对象2. 元素的比较2.1 基本类型的比较2.2 对象比较的问题 3. 对象的比较3.1 覆写基类的equals3.2 基于Comparble接口类的比较3.3 基于比较器比较3.4 三种方式对比 4. 集合框架中PriorityQueue的比较方式5. 使用PriorityQueue创建大小堆…

【AI_Design】Midjourney学习笔记

目录 后缀解析Promot合格使用prompt关键词描述 关键词化合作用关键词网站推荐 联合Chatgpt使用总结 后缀解析 –ar&#xff1a;宽高比设置–c&#xff1a;多样性设置&#xff08;数值0-100&#xff0c;默认值0&#xff09;–s&#xff1a;风格化设置&#xff08;数值0-1000&am…

Java面试——计网篇

一、基础篇 1、 TCP/IP 网络模型 对于同一台设备上的进程间通信&#xff0c;有很多种方式&#xff0c;比如有管道、消息队列、共享内存、信号等方式&#xff0c;而对于不同设备上的进程间通信&#xff0c;就需要网络通信&#xff0c;而设备是多样性的&#xff0c;所以要兼容多…

结构体--共用体--枚举 之难点——链表 奋力学习嵌入式的第十六天

结构体 注意&#xff1a; 1.结构体类型 可以定义在 函数里里面 但是此时作用域就被限定在该函数中 2.结构体定义形式 //形式一 限定一类型 后定义变量 struct stu { ... }; struct stu s; //形式二 定义类型的同时 定义变量 struct stu { ... }s1,s2,*s3,s4[10]; struc…

【说明】Nginx配置反向代理但是不包含某个地址

【说明】Nginx配置反向代理但是不包含某个地址 配置 反向代理 /api 这个路径 但是不包含 /api/wechat/service 这个请求 www.weixin.com/api/wechat/service www.weixin.com/api/getUser OK location ^~ /api(?!/wechat/service) { // OK }

影院购票|电影院订票选座小程序|基于微信小程序的电影院购票系统设计与实现(源码+数据库+文档)

电影院订票选座小程序目录 目录 基于微信小程序的电影院购票系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、用户功能实现 2、管理员功能实现 &#xff08;1&#xff09;影院信息管理 &#xff08;2&#xff09;电影信息管理 &#xff08;3&#xff09;已…

STM32F1 - 存储器映射

Memory mapping 1> 外设内存地址映射2> GPIO寄存器映射3> 存储器访问 1> 外设内存地址映射 1> STM32F103ZET6的地址线位宽为32位&#xff0c;所以寻址空间为4GB &#xff08;2 ^ 32 4GB&#xff09;&#xff1b; 2> STM32将&#xff0c;Flash&#xff0c;SR…

PageHelper.startPage(pageNum, pageSize);分页总数不正确,避坑!

今天在调用一个查询列表的接口时&#xff0c;分页总数老是查的不正确&#xff1a; 当pageSize选择10时&#xff0c;总数只有10条 当pageSize选择20时&#xff0c;总数只有15条 实际上总数为15条实在正确的&#xff0c;然后取看代码&#xff1a; Overridepublic AjaxResult pro…

中科大计网学习记录笔记(四):Internet 和 ISP | 分组延时、丢失和吞吐量

前言&#xff1a; 学习视频&#xff1a;中科大郑烇、杨坚全套《计算机网络&#xff08;自顶向下方法 第7版&#xff0c;James F.Kurose&#xff0c;Keith W.Ross&#xff09;》课程 该视频是B站非常著名的计网学习视频&#xff0c;但相信很多朋友和我一样在听完前面的部分发现信…

32GPIO输入&按键控制LED&光敏控制蜂鸣器

目录 一.硬件 二.硬件电路 三.C语言基础 四.代码实现 1.按键控制LED (1)自己的代码逻辑 (2)视频的代码逻辑 2.光敏控制蜂鸣器 一.硬件 光线越强&#xff0c;光敏电阻的阻值越小 温度越高&#xff0c;热敏电阻的阻值就越小 红外光线越强&#xff0c;红外接收管的阻值就…

harmony os系统

因为实验室配的是Windows电脑&#xff0c;最近在搜索marginnote有没有windows的版本&#xff0c;不然好多功能相似的软件在使用不能信息同步是挺麻烦的。搜索结果当然还是没有对应版本。那我退而求其次&#xff0c;看看怎么在Windows上使用marginnote&#xff0c;结果大家意见基…

Android super.img解包和打包指南(含工具下载lpunpack、lpmake、lpdump)

本文所有命令均需要在linux 上执行 一、解包 1、将Android sparse image格式的super.img转成二进制文件 $ sudo apt install android-sdk-libsparse-utils $ simg2img super.img super.img.bin 2、下载工具lpunpack 和lpmake、lpdump 以及其依赖库 下载地址:https://downl…

Excel计算表达式的值

Excel如何求解表达式 其中第三种方法最简单&#xff0c;通过剪贴板实现 如&#xff0c;单元格A1中输入了 12345 然后在A2输入 “”&A1 然后复制A2&#xff0c;打开剪贴板&#xff0c;点击刚才复制的内容&#xff0c;就会在A2显示计算结果

vite, vue3, vue-router, vuex, ES6学习日记

学习使用vitevue3的所遇问题总结&#xff08;2024年2月1日&#xff09; 组件中使用<script>标签忘记加 setup 这会导致Navbar 没有暴露出来&#xff0c;导致使用不了&#xff0c;出现以下报错 这是因为&#xff0c;如果不用setup&#xff0c;就得使用 export default…

拓扑、监控、展示、流量、资产一体化管理,重庆石柱中医院部署智和信通统一运维平台

县中医院创建于1983年&#xff0c;是集医疗、教学、科研、急救、康复为一体的国家“二级甲等”综合性中医院&#xff0c;其智慧医院建设总体目标是以患者为中心&#xff0c;电子病历为核心&#xff0c;基于医院信息平台&#xff0c;实现全院资源的统一调度与管理&#xff0c;为…

在线强化学习算法集锦

本文实现以下多种在线强化学习算法&#xff0c;每个算法都可以独立运行并测试&#xff0c;且在文章最后提供pytorch版本的代码实现&#xff0c;以下是每个算法的简要介绍&#xff1a; 1. Q-learning Q-learning是一种基于值迭代的强化学习算法&#xff0c;用于学习在不同状态下…

LeetCode 热题 100 | 链表(上)

目录 1 基础知识 1.1 空指针 1.2 结构体 1.3 指针访问 1.4 三目运算符 2 160. 相交链表 3 206. 反转链表 4 234. 回文链表 菜鸟做题第三周&#xff0c;语言是 C 1 基础知识 1.1 空指针 使用 nullptr 来判断是否为空指针&#xff1a; if (headA nullptr) …

python3支持在通过requests库调试django后台接口写测试用例

python测试用例库使用 unittest库可以支持单元测试用例编写和验证。 基本使用方法 运行文件可以将文件中的用例全部执行一遍 import unittestclass TestBasicFunc(unittest.TestCase):def test_basic_asert(self):self.assertEqual(1, 1)if __name__"__main__":u…

Kafka集群搭建

Kafka集群是把状态保存在Zookeeper中的&#xff0c;首先要搭建Zookeeper集群。 本期是分享Kafka&#xff0c;若想看zookeeper搭建请看&#xff1a;zookeeper搭建&#xff08;单机模式和集群模式)-CSDN博客 ​​​​​​​ ​​…

最新!2024顶级SCI优化!TTAO-CNN-BiGRU-MSA三角拓扑聚合优化、双向GRU融合注意力的多变量回归预测程序!

适用平台&#xff1a;Matlab 2023版及以上 TTOA三角聚合优化算法&#xff0c;将在2024年3月正式发表在中科院1区顶级SCI期刊《Expert Systems with Applications》上。 该算法提出时间极短&#xff0c;目前以及近期内不会有套用这个算法的文献。新年伊始&#xff0c;尽快拿下…