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> 大视频分段录制,最后合并…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...
技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...
Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
实战三:开发网页端界面完成黑白视频转为彩色视频
一、需求描述 设计一个简单的视频上色应用,用户可以通过网页界面上传黑白视频,系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观,不需要了解技术细节。 效果图 二、实现思路 总体思路: 用户通过Gradio界面上…...
comfyui 工作流中 图生视频 如何增加视频的长度到5秒
comfyUI 工作流怎么可以生成更长的视频。除了硬件显存要求之外还有别的方法吗? 在ComfyUI中实现图生视频并延长到5秒,需要结合多个扩展和技巧。以下是完整解决方案: 核心工作流配置(24fps下5秒120帧) #mermaid-svg-yP…...
加密通信 + 行为分析:运营商行业安全防御体系重构
在数字经济蓬勃发展的时代,运营商作为信息通信网络的核心枢纽,承载着海量用户数据与关键业务传输,其安全防御体系的可靠性直接关乎国家安全、社会稳定与企业发展。随着网络攻击手段的不断升级,传统安全防护体系逐渐暴露出局限性&a…...
数据库——redis
一、Redis 介绍 1. 概述 Redis(Remote Dictionary Server)是一个开源的、高性能的内存键值数据库系统,具有以下核心特点: 内存存储架构:数据主要存储在内存中,提供微秒级的读写响应 多数据结构支持&…...
DeepSeek越强,Kimi越慌?
被DeepSeek吊打的Kimi,还有多少人在用? 去年,月之暗面创始人杨植麟别提有多风光了。90后清华学霸,国产大模型六小虎之一,手握十几亿美金的融资。旗下的AI助手Kimi烧钱如流水,单月光是投流就花费2个亿。 疯…...
boost::filesystem::path文件路径使用详解和示例
boost::filesystem::path 是 Boost 库中用于跨平台操作文件路径的类,封装了路径的拼接、分割、提取、判断等常用功能。下面是对它的使用详解,包括常用接口与完整示例。 1. 引入头文件与命名空间 #include <boost/filesystem.hpp> namespace fs b…...
