springBoot中service层查询使用多线程CompletableFuture(有返回值)
重点:
1. 创建线程池
Executor executor = Executors.newCachedThreadPool();//保存线程List<CompletableFuture<Void>> futures = new ArrayList<>();
2.使用
//这里可以是多个看下面代码是在for中使用的
CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {},executor );
3.等待所有线程执行完毕
futures.add(future);
4.等待所有线程执行完毕
CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join();
byTimelist方法:
在这个byTimelist方法示例中,我们使用CompletableFuture.supplyAsync()将每个vehicleStatisticsMapper.chuchelist(chuchelistVo)方法调用包装起来,并返回一个CompletableFuture,其中结果的类型为Long。
然后,我们在相应的位置获取异步任务的结果,使用get()方法阻塞当前线程,直到结果可用。
package com.ruoyi.system.service.vehiclestatistics;import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.system.domain.vo.ChuchelistVo;
import com.ruoyi.system.domain.vo.VehicleStatisticsVo;
import com.ruoyi.system.mapper.vehiclestatistics.VehicleStatisticsMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;@Service
public class VehicleStatisticsServiceimpl implements VehicleStatisticsService {@AutowiredVehicleStatisticsMapper vehicleStatisticsMapper;@Overridepublic List<VehicleStatisticsVo> byTimelist(String startTime, String endTime) {List<VehicleStatisticsVo> vehicleStatisticsVos = vehicleStatisticsMapper.byTimelist(startTime, endTime);List<CompletableFuture<Void>> futures = new ArrayList<>();/*** 使用线程池的工厂方法创建线程池(会自动设置线程的数量大小)*/Executor executor = Executors.newCachedThreadPool();for (VehicleStatisticsVo vehicleStatisticsVo : vehicleStatisticsVos) {CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {ChuchelistVo chuchelistVo = new ChuchelistVo();chuchelistVo.setStartTime(startTime);chuchelistVo.setEndTime(endTime);chuchelistVo.setDeptid(Long.valueOf(vehicleStatisticsVo.getBmId()));chuchelistVo.setChsingletype("值班");CompletableFuture<Long> zhibanFuture = CompletableFuture.supplyAsync(() ->(long) vehicleStatisticsMapper.chuchelist(chuchelistVo).size(),executor);chuchelistVo.setChsingletype("紧急");CompletableFuture<Long> jjChucheFuture = CompletableFuture.supplyAsync(() ->(long) vehicleStatisticsMapper.chuchelist(chuchelistVo).size(),executor);chuchelistVo.setChsingletype("正常");CompletableFuture<Long> chuCheFuture = CompletableFuture.supplyAsync(() ->(long) vehicleStatisticsMapper.chuchelist(chuchelistVo).size(),executor);ChuchelistVo chuchelistVo2 = new ChuchelistVo();chuchelistVo2.setStartTime(startTime);chuchelistVo2.setEndTime(endTime);chuchelistVo2.setLongAndShortparame("and cc.sempid=0");chuchelistVo2.setDeptid(Long.valueOf(vehicleStatisticsVo.getBmId()));CompletableFuture<Long> dtChucheFuture = CompletableFuture.supplyAsync(() ->(long) vehicleStatisticsMapper.chuchelist2(chuchelistVo2).size(),executor);chuchelistVo2.setLongAndShortparame("and cc.sempid!=0");CompletableFuture<Long> ctChucheFuture = CompletableFuture.supplyAsync(() ->(long) vehicleStatisticsMapper.chuchelist2(chuchelistVo2).size(),executor);try {vehicleStatisticsVo.setZhiban(zhibanFuture.get());vehicleStatisticsVo.setJjChuche(jjChucheFuture.get());vehicleStatisticsVo.setChuChe(chuCheFuture.get());vehicleStatisticsVo.setDtChuche(dtChucheFuture.get());vehicleStatisticsVo.setCtChuche(ctChucheFuture.get());} catch (InterruptedException | ExecutionException e) {e.printStackTrace();}},executor);futures.add(future);}CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join();return vehicleStatisticsVos;}@Overridepublic AjaxResult bytypelist(ChuchelistVo chuchelistVo1) {Map<String, Object> ms = new HashMap<>();Map<String, Object> rs = new HashMap<>();Map<String, Object> rs2 = new HashMap<>();ChuchelistVo chuchelistVo = new ChuchelistVo();chuchelistVo.setStartTime(chuchelistVo1.getStartTime());chuchelistVo.setEndTime(chuchelistVo1.getEndTime());chuchelistVo.setChsingletype(chuchelistVo1.getChsingletype());for (Long deptid : chuchelistVo1.getDeptids()) {chuchelistVo.setDeptid(deptid);rs2.put("部门id", deptid);rs2.put("部门名称", vehicleStatisticsMapper.chuchelist(chuchelistVo).size() > 0 ? vehicleStatisticsMapper.chuchelist(chuchelistVo).get(0).getDeptname() : ("" + deptid));rs2.put("listsize", (long) vehicleStatisticsMapper.chuchelist(chuchelistVo).size());rs2.put("list",vehicleStatisticsMapper.chuchelist(chuchelistVo));rs.put(vehicleStatisticsMapper.chuchelist(chuchelistVo).size() > 0 ? vehicleStatisticsMapper.chuchelist(chuchelistVo).get(0).getDeptname() : ("" + deptid),rs2);}ms.put("result", rs);ms.put("startTime", chuchelistVo.getStartTime());ms.put("endTime", chuchelistVo.getEndTime());return AjaxResult.success(ms);}@Overridepublic AjaxResult bylongandshortparamelist(ChuchelistVo chuchelistVo1) {Map<String, Object> ms = new HashMap<>();Map<String, Object> rs = new HashMap<>();Map<String, Object> rs2 = new HashMap<>();ChuchelistVo chuchelistVo = new ChuchelistVo();chuchelistVo.setStartTime(chuchelistVo1.getStartTime());chuchelistVo.setEndTime(chuchelistVo1.getEndTime());if (chuchelistVo1.getLongAndShortparame() != null) {if ("长途".equals(chuchelistVo1.getLongAndShortparame())) {chuchelistVo.setLongAndShortparame("and cc.sempid=0");}if ("短途".equals(chuchelistVo1.getLongAndShortparame())) {chuchelistVo.setLongAndShortparame("and cc.sempid!=0");}}for (Long deptid : chuchelistVo1.getDeptids()) {chuchelistVo.setDeptid(deptid);List<ChuchelistVo> chuchelistVos = vehicleStatisticsMapper.chuchelist2(chuchelistVo);rs2.put(chuchelistVos.size() > 0 ? chuchelistVos.get(0).getDeptname() : ("" + deptid), (long) chuchelistVos.size());rs2.put("部门id", deptid);rs2.put("部门名称", chuchelistVos.size() > 0 ? chuchelistVos.get(0).getDeptname() : ("" + deptid));rs2.put("listsize", chuchelistVos.size());rs2.put("list", chuchelistVos);rs.put(chuchelistVos.size() > 0 ? chuchelistVos.get(0).getDeptname() : ("" + deptid), rs2);}ms.put("result", rs);ms.put("startTime", chuchelistVo.getStartTime());ms.put("endTime", chuchelistVo.getEndTime());return AjaxResult.success(ms);}}
相关文章:
springBoot中service层查询使用多线程CompletableFuture(有返回值)
重点: 1. 创建线程池 Executor executor Executors.newCachedThreadPool();//保存线程List<CompletableFuture<Void>> futures new ArrayList<>();2.使用 //这里可以是多个看下面代码是在for中使用的 CompletableFuture<Void> future …...
畜牧虚拟仿真 | 鱼授精过程VR模拟演练系统
随着科技的发展,虚拟现实(VR)技术逐渐渗透到各个领域,为人们提供了更加真实、直观的体验。在动物养殖教育领域,鱼授精过程VR模拟演练系统正成为一种新的教学手段,它能够帮助人们更好地理解和掌握鱼授精的操作技巧,从而…...
第一百一十四回 局部动态列表
文章目录 概念介绍实现方法示例代码 我们在上一章回中介绍了dart语言中的 setter/getter相关的内容,本章回中将介绍 局部动态列表.闲话休提,让我们一起Talk Flutter吧。 概念介绍 在正常情况下列表位于整个页面中,而且可以在整个页面中滚动…...
多尺度目标检测【动手学深度学习】
在上篇博客《锚框【目标检测】》中,我们以输入图像的每个像素为中心,生成多个锚框。基本而言,这些锚框代表了图像不同区域的样本。然而如果以每个像素都生成的锚框,最后可能会得到太多需要计算的锚框。想象一个561728的输入图像,如果以每个像素为中心生成五个形状不同的锚…...
elasticsearch 基础
ES 搜索技术历史 今天看的是《Elasticsearch实战与原理解析》 第一章 搜索技术发展史 1、搜索技术发展史 宏观而言,搜索引擎的发展经历了五个尖端和两大分类。五个阶段分别是ftp文件检索阶段、分类目录阶段、文本相关性检索阶段、网页链接分析阶段和用户意图识别…...
【BUG】docker安装nacos,浏览器却无法访问到页面
个人主页:金鳞踏雨 个人简介:大家好,我是金鳞,一个初出茅庐的Java小白 目前状况:22届普通本科毕业生,几经波折了,现在任职于一家国内大型知名日化公司,从事Java开发工作 我的博客&am…...
C#引用Web Service 类型方法,添加搜索本地服务器Web Service 接口调用方法
首先保证现在网络能调用web service接口,右键项目添加服务引用  点击高级 添加web服务 输入搜索的服务器接口,选中你要添加调用的方法即可 添加完成调用方…...
yolov8训练进阶:新增配置参数
续yolov8训练进阶:自定义训练脚本,从配置文件载入训练超参数_CodingInCV的博客-CSDN博客 尽管yolov8有很多参数可以设置,但难免我们训练过程中会需要增加自己的参数,如新的数据增强、自定义的一些条件。那么在yolov8中如何实现呢&…...
轻量级自动化测试框架WebZ
一、什么是WebZ WebZ是我用Python写的“关键字驱动”的自动化测试框架,基于WebDriver。 设计该框架的初衷是:用自动化测试让测试人员从一些简单却重复的测试中解放出来。之所以用“关键字驱动”模式是因为我觉得这样能让测试人员(测试执行人员…...
如何实现安全上网
l 场景描述 政府、军工、科研等涉密单位或企业往往要比其他组织更早接触高精尖的技术与产品,相对应的数据保密性要求更高。常规的内外网物理隔离手段,已经满足不了这些涉密单位的保密需求,发展到现在,需求已经演变成既要保证网络…...
Redis心跳检测
在命令传播阶段,从服务器默认会以每秒一次的频率,向主服务器发送命令: REPLCON FACK <rep1 ication_ offset>其中replication_offset是从服务器当前的复制偏移量。 发送REPLCONF ACK命令对于主从服务器有三个作用: 检测主…...
【数据库】Sql Server可视化工具SSMS条件和SQL窗格以及版本信息
2023年,第34周,第1篇文章。给自己一个目标,然后坚持总会有收货,不信你试试! SQL SERVER 官方本身就有数据库可视化管理工具SSMS,所以大部分都会使用SSMS。以前版本是直接捆绑, 安装完成就自带有…...
Python SFTP 详细使用
Python SFTP 详细使用 SFTP(SSH File Transfer Protocol)是一种基于SSH协议的安全文件传输协议。Python提供了paramiko库来实现SFTP功能。本文将详细介绍如何使用Python和paramiko库进行SFTP操作。 安装paramiko库 首先,我们需要安装param…...
MyBatis的XML映射文件
Mybatis的开发有两种方式: 注解 XML配置文件 通过XML配置文件的形式来配置SQL语句,这份儿XML配置文件在MyBatis当中也称为XML映射文件。 导学:在MyBatis当中如何来定义一份儿XML映射文件? 在MyBatis当中,定义XML…...
UML-类图和对象图
目录 类图概述: 1.类: 2.属性: 3.类的表示: 4.五种方法: 类图的关系: 1.关联 2.聚合 3.组合 4.依赖 5.泛化 6.实现 对象图概述: 1. 对象图包含元素: 2. 什么是对象 3.对象的状态可以改变: 4.对象的行为 5.对象标…...
升级指定版本Node.js或npm
一. 下载指定node.js版本Node.js 二. 升级node.js版本 打开电脑cmd 输入 npm install node18.17.1 -g 三. 升级npm版本 打开电脑cmd 输入 npm install npm8.1.2 -g...
UE4/5 GAS技能系统入门3 - GameplayEffect
阅读本文需要上一篇AttributeSet的基础知识: https://blog.csdn.net/grayrail/article/details/132148492 本文也并非教程性质文章,主要讲解学习记录为主。 这篇开始讲AttributeSet配置好后,GameplayEffect的使用。 1.将GE配置至Ability Co…...
Linux交叉编译opencv并移植ARM端
Linux交叉编译opencv并移植ARM端 - 知乎 一、安装交叉编译器 目标平台为arm7l,此为32位ARM架构,要安装合适的编译器 sudo apt install arm-linux-gnueabihf-gcc sudo apt install arm-linux-gnueabihf-g注意:64位ARM架构的编译器与32位ARM架…...
TypeScript教程(一)简介与安装
一、简介 TypeScript 是 JavaScript 的一个超集,扩展了JavaScript的语法,因此现有的JavaScript可与TypeScript一起工作无需修改,支持 ECMAScript 6 标准(ES6 教程)。 语言特性: 1.类型批注和编译时类型检…...
做视频_Style
Video 1> 风格2> 技巧3> 借鉴 🔗 B站视频 1> 风格 记录分享生活,工作,学习方面的总结; 4个段位: 实用 -> 简洁 -> 清晰流畅 -> 生动有趣 2> 技巧 1> 大视频分段录制,最后合并…...
FlowState Lab与SpringBoot集成:构建企业级波动分析微服务
FlowState Lab与SpringBoot集成:构建企业级波动分析微服务 1. 引言:当AI预测遇上微服务架构 电商大促期间的服务器负载波动、金融交易中的异常流量监测、物流系统的季节性需求变化...这些业务场景都需要对时序数据进行实时分析和预测。传统单机版的分析…...
NEURAL MASK效果展示:水墨画/油画/素描等艺术风格图像分割能力
NEURAL MASK效果展示:水墨画/油画/素描等艺术风格图像分割能力 1. 艺术级图像分割新体验 在图像处理领域,精准的主体分割一直是创作者们的核心需求。传统的抠图工具在面对复杂艺术风格图像时往往力不从心——水墨画的晕染边缘、油画的笔触纹理、素描的…...
Paimon实时数据湖实战:五种分桶模式选型与性能调优指南
1. Paimon分桶机制的核心价值 分桶是Paimon数据湖架构中提升性能的关键设计。想象你管理一个超大型图书馆,如果所有书籍都堆放在一起,每次找书都需要全馆搜索。但如果你按照书籍编号将书架分成100个区域,找书时只需计算编号哈希就能直达对应区…...
造相Z-Image文生图模型快速试用:10秒生成高清图片,简单易用
造相Z-Image文生图模型快速试用:10秒生成高清图片,简单易用 1. 快速体验:10秒生成你的第一张AI画作 1.1 一键部署模型 在CSDN星图镜像市场找到"造相 Z-Image 文生图模型(内置模型版)v2"镜像,点…...
深入解析74181芯片中Cn+1的进位逻辑与实现原理
1. 74181芯片与Cn1进位的基础认知 第一次接触74181这块经典ALU芯片时,我被它内部精巧的进位逻辑设计震撼到了。这块诞生于上世纪60年代的4位算术逻辑单元,至今仍是理解计算机运算基础的绝佳教学案例。其中最精妙的部分莫过于Cn1进位信号的生成机制——它…...
RTX4090D加持下的OpenClaw:Qwen3-32B多任务并行处理实测
RTX4090D加持下的OpenClaw:Qwen3-32B多任务并行处理实测 1. 测试背景与硬件配置 去年底我入手了RTX4090D显卡,一直想找个机会测试它在AI工作负载下的真实表现。最近在部署OpenClaw时,发现其多任务调度能力对显存和计算资源的需求极高&#…...
别再只盯着RTK了!聊聊GNSS/INS组合导航里,紧耦合如何用1颗卫星‘吊住’你的定位
1颗卫星的逆袭:紧耦合技术如何在极端环境下守护你的定位精度 想象一下,你正驾驶一辆L4级自动驾驶汽车穿越曼哈顿的钢铁森林。高楼间的"城市峡谷"让GPS信号时断时续,传统导航系统已经开始报警——"卫星信号丢失"。但你的车…...
如何用TradingAgents-CN打造你的AI投资顾问:5步构建智能交易系统
如何用TradingAgents-CN打造你的AI投资顾问:5步构建智能交易系统 【免费下载链接】TradingAgents-CN 基于多智能体LLM的中文金融交易框架 - TradingAgents中文增强版 项目地址: https://gitcode.com/GitHub_Trending/tr/TradingAgents-CN 作为一名有着十年投…...
MS5803-14BA I²C驱动开发:嵌入式压力传感器实战指南
1. MS5803-14BA压力传感器库深度解析:面向嵌入式工程师的IC驱动开发实践1.1 传感器核心特性与工程定位MS5803-14BA是TE Connectivity(原Measurement Specialties)推出的高精度数字压力/温度复合传感器,采用MEMS压阻式传感原理与Δ…...
CM1数值模拟新手避坑指南:从namelist.input配置到并行计算实战
CM1数值模拟新手避坑指南:从namelist.input配置到并行计算实战 刚接触CM1模式的研究人员常常会在配置文件和并行计算环节踩坑——某个参数设置不当可能导致数小时的计算结果突然崩溃,或是并行效率低下浪费计算资源。本文将用真实案例拆解那些文档里没写…...
