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集合 ,实用示例
前言 哲学提问镇贴: 不了解异步怎么使用的看官, 可阅: SpringBoot 最简单的使用异步线程案例 Async_小目标青年的博客-CSDN博客 Springboot Async异步扩展使用 结合 CompletableFuture_小目标青年的博客-CSDN博客 想了解更多关于批量list处…...
SQLMAP工具基础使用
本文用的是kali自带的sqlmap工具 我们通过常用命令来理解sqlmap的基本使用 目录 检测注入 获取敏感信息 获取表 获取表的字段 获取数据 --technique 使用指定的注入方式 使用基于时间的延时注入 支持多种注入检测 默认是全部 注入时使用随机的 HTTP User-Agent 设置超时时间 读…...
初学多线程爬虫
多线程在爬虫中应用非常广泛,对于中大型项目来说很有必要,今天我将以初学者的姿态来完成一个简单的多线程爬虫程序。 1、如何认识多线程 计算机完成一项或多项任务,往往可以存在很高的并行度:若是多核处理器则天然的可以同时处理…...
python-实验报告-3
1、编写程序,用户输入一个五位整数,输出其千位和十位数字之和。 num int(input()) # 12345 s1 (num//1000)%10 s2 (num//10)%10sum s1 s2 print(sum)心得: 首先,程序通过 input() 函数获取用户输入的整数,保存在…...
00_托管网站在Tor网络上_Ubuntu主机
title: 托管网站在Tor网络上 urlname: 00_托管网站在Tor网络上_Ubuntu主机 date: 2017-04-24 03:03:03 tags: 小技巧 categories: [小技巧] 托管网站在Tor网络上(Ubuntu主机)https://www.t00ls.net/thread-44040-1-1.html 大部分人接触Tor网络是由Tor …...
个人练习-Leetcode-659. Split Array into Consecutive Subsequences
题目链接:https://leetcode.cn/problems/split-array-into-consecutive-subsequences/ 题目大意:给出一个非递减数列nums[],判断其是否能被分割成若干个满足以下条件的子列: 长度大于等于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>如何取值?查看ProjectConfig.mk 如果MTK_SIGNATURE_CUSTOMIZATIONyes并且MTK_INTERNALno…...
使用Buildroot制作根文件系统
寒暄几句 学习了uboot、内核、busybox根文件系统,想着做一个音频播放器。最后发现好像busybox好像没有带aplay架构,这就很麻烦需要自己移植。为了简便我就找大佬沟通了一下,大佬推荐了Buildroot工具来制作根文件系统。 平台 开发板&#x…...
Java_Spring:5. 基于注解的 IOC 配置
目录 1 环境搭建 1.1 第一步:拷贝必备 jar 包到工程的 lib 目录。 1.2 第二步:使用Component 注解配置管理的资源 1.3 第三步:创建 spring 的 xml 配置文件并开启对注解的支持 2 常用注解 2.1 用于创建对象的注解 2.1.1 Component 2.1…...
Git下的.gitignore文件
.gitignore .gitignore是一个文件,这个文件用来指定哪些文件提交到 git 管理,也就是 git commit 不会提交这些文件 .gitignore文件的语法 注释 "#" 表示注释 # 注释 忽略指定文件/文件夹 直接写入文件或文件夹名即可,指定文…...
Unity集成GPT
GPT想必是最近互联网最火的话题了,作为一个Unity开发者,今天来介绍一下如何在Unity中使用GPT。 一、API 密钥 使用GPT的API首先要获得密钥,如下进入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(前端控制器)2 HandlerMapping(处理器映射器)3 Handler(处理器)4 HandlerAdapter(处理器适配器)5 ViewRe…...
2步搞定拼版!AD通用拼版技巧分享!
你是不是也看过很多拼版教程,一整篇文章全部都是文字说明和各种图示,照着一步步去做,都需要一些时间才能勉强搞定。 之前我用过AD20的自带拼版工具,功能上比较简单,而且菜单没有全部汉化,对于新手来说&…...
再学C语言47:字符串输出
C中有3个用于输出字符串的标准库函数:puts(),fputs(),printf() 一、puts()函数 示例代码: /* test of puts() function */ #include <stdio.h>#define ARR_T "I am an array."int main(void) {char str1[100] …...
银行数字化转型导师坚鹏:如何制定银行数字化转型年度培训规划
如何制定银行数字化转型年度培训规划 ——以推动银行数字化转型战略落地为核心,实现知行果合一课程背景: 很多银行都在开展银行数字化转型培训工作,目前存在以下问题急需解决:缺少针对性的银行数字化转型年度培训规划不清楚如…...
RFID技术在物流行业中的应用:优化物流流程,提高效率
随着物流行业的不断发展,如何优化物流流程、提高效率成为了每个物流从业者关注的重点。RFID技术作为一种先进的自动识别技术,正逐渐被广泛应用于物流行业,帮助企业降低成本、提高运营效率。本文将重点介绍RFID技术在物流行业中的应用…...
安卓机器学习框架学习:Android Neural Networks API (NNAPI)
Android Neural Networks API (NNAPI) 简介: 1、Android Neural Networks API (NNAPI) 是一个 Android C API,在 Android 设备上实现机器学习; 2、NNAPI 旨在为更高层级的机器学习框架(如 TensorFlow Lite 和 Caffe2)…...
阿里云GPU服务器收费标准、学生价格及一个小时费用大全
阿里云GPU租用费用价格表,GPU计算卡包括NVIDIA V100计算卡、T4计算卡、A10计算卡和A100计算卡,GPU云服务器gn6i可享受3折优惠,阿里云百科分享阿里云GPU服务器学生优惠价格、GPU服务器收费价格表、GPU服务器多少钱一个小时等费用明细表&#x…...
Asp.net core 依赖注入 (带案例以及注释理解)
1.很多朋友不知道什么是依赖注入,接下来我用比较通俗易懂的话语 来帮助大家理解 依赖注入(Dependency Injection,简称DI)是一种设计模式,用于减少组件之间的耦合度。它的核心思想是,将组件之间的依赖关系从…...
(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...
51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...
以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...
抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...
1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...
