当前位置: 首页 > news >正文

Springboot 多线程分批切割处理 大数据量List集合 ,实用示例

 
前言

哲学提问镇贴:


不了解异步怎么使用的看官, 可阅:

SpringBoot 最简单的使用异步线程案例 @Async_小目标青年的博客-CSDN博客

Springboot Async异步扩展使用 结合 CompletableFuture_小目标青年的博客-CSDN博客

想了解更多关于批量list处理操作的看官,可阅:
 

Java List数据量大, 需要分片批次操作_小目标青年的博客-CSDN博客

Mybatis 批量插入 采用分批处理一次500条_小目标青年的博客-CSDN博客

Springboot 手动分页查询,分批批量插入数据_小目标青年的博客-CSDN博客

正文

话不多说,本篇核心介绍的是日常毕竟常遇到的一些处理点。


首先list数据量大,需要切割操作 :

        

        //模拟拿到的数据量大的listList<Product> products = getBatchListTest();//直接用Lists.partition 按照100条一次切割List<List<Product>> allList = Lists.partition(products, 100);//循环分批处理切割的listfor (List<Product> batchProducts :allList){productService.batchDealList(batchProducts);}


        
但是往往有时候 数据量是真大,切割完循环处理 还嫌慢

是的,因为循环处理是串行的, 也就是,比如500条数据的list,切割成5个 batchList。

如果每次处理一个barchList要1秒钟,那么循环串行处理5次,就是 1X5=5 秒。

所以我们分批切割这样串行处理完,觉得慢, 如果业务场景合适,我们可以试着改 并行 处理。

开袋及食:
 

① 配置一个线程池,交给spring管理的 线程池,用起来才放心、安心:

 ThreadConfig.java 

import java.util.concurrent.Executor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;@Configuration
@EnableAsync
public class ThreadConfig  {/*** 执行需要依赖线程池,这里就来配置一个线程池* @return*/// 当池子大小小于corePoolSize,就新建线程,并处理请求// 当池子大小等于corePoolSize,把请求放入workQueue(QueueCapacity)中,池子里的空闲线程就去workQueue中取任务并处理// 当workQueue放不下任务时,就新建线程入池,并处理请求,如果池子大小撑到了maximumPoolSize,就用RejectedExecutionHandler来做拒绝处理// 当池子的线程数大于corePoolSize时,多余的线程会等待keepAliveTime长时间,如果无请求可处理就自行销毁@Bean("MyExecutor")public Executor getExecutor() {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();//设置核心线程数executor.setCorePoolSize(10);//设置最大线程数executor.setMaxPoolSize(100);//线程池所使用的缓冲队列executor.setQueueCapacity(250);//设置线程名executor.setThreadNamePrefix("JcTest-Async");//设置多余线程等待的时间,单位:秒//executor.setKeepAliveSeconds();// 初始化线程executor.initialize();return executor;}
}

 看看我们并行的写法:

 

    @AutowiredThreadConfig threadConfig;@PostMapping("doBatchParallelTes")public void doBatchParallelTes() {List<Product> products = getBatchListTest();List<List<Product>> allList = Lists.partition(products, 100);int batchNum = allList.size();StopWatch stopWatch = new StopWatch();stopWatch.start();Executor threadConfigExecutor = threadConfig.getExecutor();List<CompletableFuture> results = new ArrayList<>();for (List<Product> batchProducts :allList){CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {productService.batchDealList(batchProducts);return "";}, threadConfigExecutor);results.add(future);}CompletableFuture.allOf(results.toArray(results.toArray(new CompletableFuture[batchNum]))).join();stopWatch.stop();System.out.println("总用时"+stopWatch.getTotalTimeMillis()+"毫秒");}

代码简析:

并行图解:

 看看执行效果:

 
那么看到这里,大家一定注意到了那个 ‘合流’ , 是不是每个业务都需要这样所谓的‘合流’?

当然不是,如果说这批list处理完完事了,不需要考虑回到主线程去做其余操作,那么我们就不需要‘合流’操作。

不需要合流,主线程走主线程逻辑,子线程自己玩自己的:

    @PostMapping("doBatchTestNew2")public void doBatchTestNew2() {List<Product> products = getBatchListTest();List<List<Product>> allList = Lists.partition(products, 100);StopWatch stopWatch = new StopWatch();stopWatch.start();Executor threadConfigExecutor = threadConfig.getExecutor();for (List<Product> batchProducts :allList){CompletableFuture.runAsync(() -> {productService.batchDealList(batchProducts);}, threadConfigExecutor);}stopWatch.stop();System.out.println("总用时"+stopWatch.getTotalTimeMillis()+"毫秒");}

效果,其实就是异步执行: 

那如果说是基于@Async 的方式去实现呢,当然也是可以的,示例:

 基于@Async 就不多说了,这个在文章开头有介绍相关文章,之前写的,介绍过玩法,就是这两篇:

SpringBoot 最简单的使用异步线程案例 @Async_小目标青年的博客-CSDN博客

Springboot Async异步扩展使用 结合 CompletableFuture_小目标青年的博客-CSDN博客

好了,该篇就到这。

相关文章:

Springboot 多线程分批切割处理 大数据量List集合 ,实用示例

前言 哲学提问镇贴&#xff1a; 不了解异步怎么使用的看官&#xff0c; 可阅&#xff1a; SpringBoot 最简单的使用异步线程案例 Async_小目标青年的博客-CSDN博客 Springboot Async异步扩展使用 结合 CompletableFuture_小目标青年的博客-CSDN博客 想了解更多关于批量list处…...

SQLMAP工具基础使用

本文用的是kali自带的sqlmap工具 我们通过常用命令来理解sqlmap的基本使用 目录 检测注入 获取敏感信息 获取表 获取表的字段 获取数据 --technique 使用指定的注入方式 使用基于时间的延时注入 支持多种注入检测 默认是全部 注入时使用随机的 HTTP User-Agent 设置超时时间 读…...

初学多线程爬虫

多线程在爬虫中应用非常广泛&#xff0c;对于中大型项目来说很有必要&#xff0c;今天我将以初学者的姿态来完成一个简单的多线程爬虫程序。 1、如何认识多线程 计算机完成一项或多项任务&#xff0c;往往可以存在很高的并行度&#xff1a;若是多核处理器则天然的可以同时处理…...

python-实验报告-3

1、编写程序&#xff0c;用户输入一个五位整数&#xff0c;输出其千位和十位数字之和。 num int(input()) # 12345 s1 (num//1000)%10 s2 (num//10)%10sum s1 s2 print(sum)心得&#xff1a; 首先&#xff0c;程序通过 input() 函数获取用户输入的整数&#xff0c;保存在…...

00_托管网站在Tor网络上_Ubuntu主机

title: 托管网站在Tor网络上 urlname: 00_托管网站在Tor网络上_Ubuntu主机 date: 2017-04-24 03:03:03 tags: 小技巧 categories: [小技巧] 托管网站在Tor网络上&#xff08;Ubuntu主机&#xff09;https://www.t00ls.net/thread-44040-1-1.html 大部分人接触Tor网络是由Tor …...

个人练习-Leetcode-659. Split Array into Consecutive Subsequences

题目链接&#xff1a;https://leetcode.cn/problems/split-array-into-consecutive-subsequences/ 题目大意&#xff1a;给出一个非递减数列nums[]&#xff0c;判断其是否能被分割成若干个满足以下条件的子列&#xff1a; 长度大于等于3元素严格递增且只相差1 子列的含义是&…...

OTA升级差分包签名

制作差分包时添加-k <key_path>参数 ./build/tools/releasetools/ota_from_target_files -k <key_path> -i old.zip new.zip update.zip<key_path>如何取值&#xff1f;查看ProjectConfig.mk 如果MTK_SIGNATURE_CUSTOMIZATIONyes并且MTK_INTERNALno&#xf…...

使用Buildroot制作根文件系统

寒暄几句 学习了uboot、内核、busybox根文件系统&#xff0c;想着做一个音频播放器。最后发现好像busybox好像没有带aplay架构&#xff0c;这就很麻烦需要自己移植。为了简便我就找大佬沟通了一下&#xff0c;大佬推荐了Buildroot工具来制作根文件系统。 平台 开发板&#x…...

Java_Spring:5. 基于注解的 IOC 配置

目录 1 环境搭建 1.1 第一步&#xff1a;拷贝必备 jar 包到工程的 lib 目录。 1.2 第二步&#xff1a;使用Component 注解配置管理的资源 1.3 第三步&#xff1a;创建 spring 的 xml 配置文件并开启对注解的支持 2 常用注解 2.1 用于创建对象的注解 2.1.1 Component 2.1…...

Git下的.gitignore文件

.gitignore .gitignore是一个文件&#xff0c;这个文件用来指定哪些文件提交到 git 管理&#xff0c;也就是 git commit 不会提交这些文件 .gitignore文件的语法 注释 "#" 表示注释 # 注释 忽略指定文件/文件夹 直接写入文件或文件夹名即可&#xff0c;指定文…...

Unity集成GPT

GPT想必是最近互联网最火的话题了&#xff0c;作为一个Unity开发者&#xff0c;今天来介绍一下如何在Unity中使用GPT。 一、API 密钥 使用GPT的API首先要获得密钥&#xff0c;如下进入OpenAI官网(https://platform.openai.com/account/api-keys)–>选择自己的账号–>查…...

Xilinx FPGA Multiboot设计与实现(Spartan-6和Kintex-7为例)

文章目录 1. FPGA固件升级方案2. Golden镜像和Multiboot镜像简介3. ISE环境下实现(XC6SLX9)4. Vivado环境下实现(XC7K325T)5. Golden镜像Header分析6. 参考资料7. 示例工程ISE、Vivado、MicroBlaze系列教程 1. FPGA固件升级方案 FPGA的硬件可编程性给设计带来了很高的灵活…...

14、SpringMVC执行流程

文章目录14、SpringMVC执行流程14.1、SpringMVC常用组件1 DispatcherServlet&#xff08;前端控制器&#xff09;2 HandlerMapping&#xff08;处理器映射器&#xff09;3 Handler&#xff08;处理器&#xff09;4 HandlerAdapter&#xff08;处理器适配器&#xff09;5 ViewRe…...

2步搞定拼版!AD通用拼版技巧分享!

你是不是也看过很多拼版教程&#xff0c;一整篇文章全部都是文字说明和各种图示&#xff0c;照着一步步去做&#xff0c;都需要一些时间才能勉强搞定。 之前我用过AD20的自带拼版工具&#xff0c;功能上比较简单&#xff0c;而且菜单没有全部汉化&#xff0c;对于新手来说&…...

再学C语言47:字符串输出

C中有3个用于输出字符串的标准库函数&#xff1a;puts()&#xff0c;fputs()&#xff0c;printf() 一、puts()函数 示例代码&#xff1a; /* test of puts() function */ #include <stdio.h>#define ARR_T "I am an array."int main(void) {char str1[100] …...

银行数字化转型导师坚鹏:如何制定银行数字化转型年度培训规划

如何制定银行数字化转型年度培训规划 ——以推动银行数字化转型战略落地为核心&#xff0c;实现知行果合一课程背景&#xff1a; 很多银行都在开展银行数字化转型培训工作&#xff0c;目前存在以下问题急需解决&#xff1a;缺少针对性的银行数字化转型年度培训规划不清楚如…...

RFID技术在物流行业中的应用:优化物流流程,提高效率

随着物流行业的不断发展&#xff0c;如何优化物流流程、提高效率成为了每个物流从业者关注的重点。RFID技术作为一种先进的自动识别技术&#xff0c;正逐渐被广泛应用于物流行业&#xff0c;帮助企业降低成本、提高运营效率。本文将重点介绍RFID技术在物流行业中的应用&#xf…...

安卓机器学习框架学习:Android Neural Networks API (NNAPI)

Android Neural Networks API (NNAPI) 简介&#xff1a; 1、Android Neural Networks API (NNAPI) 是一个 Android C API&#xff0c;在 Android 设备上实现机器学习&#xff1b; 2、NNAPI 旨在为更高层级的机器学习框架&#xff08;如 TensorFlow Lite 和 Caffe2&#xff09…...

阿里云GPU服务器收费标准、学生价格及一个小时费用大全

阿里云GPU租用费用价格表&#xff0c;GPU计算卡包括NVIDIA V100计算卡、T4计算卡、A10计算卡和A100计算卡&#xff0c;GPU云服务器gn6i可享受3折优惠&#xff0c;阿里云百科分享阿里云GPU服务器学生优惠价格、GPU服务器收费价格表、GPU服务器多少钱一个小时等费用明细表&#x…...

Asp.net core 依赖注入 (带案例以及注释理解)

1.很多朋友不知道什么是依赖注入&#xff0c;接下来我用比较通俗易懂的话语 来帮助大家理解 依赖注入&#xff08;Dependency Injection&#xff0c;简称DI&#xff09;是一种设计模式&#xff0c;用于减少组件之间的耦合度。它的核心思想是&#xff0c;将组件之间的依赖关系从…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

前言 现在我们有个如下的需求&#xff0c;设计一个邮件发奖的小系统&#xff0c; 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建&#xff08;全平台详解&#xff09; 在开始使用 React Native 开发移动应用之前&#xff0c;正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南&#xff0c;涵盖 macOS 和 Windows 平台的配置步骤&#xff0c;如何在 Android 和 iOS…...

三维GIS开发cesium智慧地铁教程(5)Cesium相机控制

一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点&#xff1a; 路径验证&#xff1a;确保相对路径.…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享

文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的&#xff0c;根据Excel列的需求预估的工时直接打骨折&#xff0c;不要问我为什么&#xff0c;主要…...

【HTML-16】深入理解HTML中的块元素与行内元素

HTML元素根据其显示特性可以分为两大类&#xff1a;块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

今日科技热点速览

&#x1f525; 今日科技热点速览 &#x1f3ae; 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售&#xff0c;主打更强图形性能与沉浸式体验&#xff0c;支持多模态交互&#xff0c;受到全球玩家热捧 。 &#x1f916; 人工智能持续突破 DeepSeek-R1&…...

AI书签管理工具开发全记录(十九):嵌入资源处理

1.前言 &#x1f4dd; 在上一篇文章中&#xff0c;我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源&#xff0c;方便后续将资源打包到一个可执行文件中。 2.embed介绍 &#x1f3af; Go 1.16 引入了革命性的 embed 包&#xff0c;彻底改变了静态资源管理的…...

招商蛇口 | 执笔CID,启幕低密生活新境

作为中国城市生长的力量&#xff0c;招商蛇口以“美好生活承载者”为使命&#xff0c;深耕全球111座城市&#xff0c;以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子&#xff0c;招商蛇口始终与城市发展同频共振&#xff0c;以建筑诠释对土地与生活的…...

Linux nano命令的基本使用

参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时&#xff0c;显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...