Java 多线程批量处理数据

1 需求
在项目开发中需要处理100万多的数据,这些数据需要从mysql数据库中读取出来,再通过调用其他平台的接口推送数据。由于时间紧迫,数据需要在短时间内完成推送,采用单线程推送很慢,所以采用多线程推送来提高效率。

2 配置多线程
2.1 application.yml

thread-pool:core-pool-size: 4max-pool-size: 16queue-capacity: 80keep-alive-seconds: 120

2.2 创建ThreadPoolProperties

import lombok.Data;
import org.springframework.stereotype.Component;
import org.springframework.boot.context.properties.ConfigurationProperties;@Data
@Component
@ConfigurationProperties(prefix = "thread-pool")
public class ThreadPoolProperties {/*** 线程池创建时候初始化的线程数*/private int corePoolSize;/*** 线程池最大的线程数,只有在缓冲队列满了之后才会申请超过核心线程数的线程*/private int maxPoolSize;/*** 用来缓冲执行任务的队列*/private int queueCapacity;/*** 允许线程的空闲时间:当超过了核心线程出之外的线程在空闲时间到达之后会被销毁*/private int keepAliveSeconds;
}

2.3 创建ThreadPoolConfig

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;@EnableAsync
@Configuration
public class ThreadPoolConfig {private final ThreadPoolProperties threadPoolProperties;@Autowiredpublic ThreadPoolConfig(ThreadPoolProperties threadPoolProperties) {this.threadPoolProperties = threadPoolProperties;}@Bean(name = "threadPoolTaskExecutor")public ThreadPoolTaskExecutor threadPoolTaskExecutor() {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();executor.setCorePoolSize(threadPoolProperties.getCorePoolSize());executor.setMaxPoolSize(threadPoolProperties.getMaxPoolSize());executor.setQueueCapacity(threadPoolProperties.getQueueCapacity());executor.setKeepAliveSeconds(threadPoolProperties.getKeepAliveSeconds());executor.setThreadNamePrefix("thread-pool-");return executor;}
}

3 多线程批量数据处理

public RequestResult multiThreadPush() {List<HistoryStudent> historyStudentList = historyStudentMapper.getList(0, 65867);// 分割集合List<List<HistoryStudent>> partitionData = partitionData(historyStudentList, 4);ThreadPoolTaskExecutor executor = SpringUtil.getBean("threadPoolTaskExecutor", ThreadPoolTaskExecutor.class);// 计数器CountDownLatch latch = new CountDownLatch(partitionData.size());for (List<HistoryStudent> historyStudents : partitionData) {executor.execute(() -> {try {for (HistoryStudent historyStudent : historyStudents) {// 单个数据处理//processSingleData(historyStudent);}} catch (Exception e) {e.printStackTrace();} finally {latch.countDown();}});}try {latch.await();} catch (InterruptedException e) {e.printStackTrace();}return RequestResult.success();
}
private List<List<HistoryStudent>> partitionData(List<HistoryStudent> dataList, int partitionSize) {List<List<HistoryStudent>> partitions = new ArrayList<>();int size = dataList.size();int batchSize = size / partitionSize;for (int i = 0; i < partitionSize; i++) {int fromIndex = i * batchSize;int toIndex = (i == partitionSize - 1) ? size : fromIndex + batchSize;partitions.add(dataList.subList(fromIndex, toIndex));}return partitions;
}

4 参考博客
Java多线程批量处理、线程池的使用
Java多线程处理大批量数据
java多线程批量处理数据

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

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

相关文章

Spring Boot插件化开发概念原理及实现

Spring Boot 是一个开源的Java框架&#xff0c;它简化了基于Spring框架的应用程序的开发和部署过程。它提供了一种快速、简单的方式来构建独立的、可执行的Spring应用程序。在Spring Boot中&#xff0c;插件化开发是一种强大的开发模式&#xff0c;它允许开发人员将应用程序的不…

OpenAI史诗级更新,最强大模型炸场,128K上下文、价格暴降2/3,定制专属GPT快到只需5分钟

今早&#xff0c;2023年最瞩目的人工智能大会举办&#xff01; CSDN11月7日报道&#xff0c;今天凌晨2点&#xff0c;在OpenAI首届开发者大会上&#xff0c;OpenAI的首席执行官萨姆•阿尔特曼&#xff08;Sam Altman&#xff09;宣布了GPT-4、ChatGPT的年度最重磅更新。 OpenA…

设置Linux时间格式

一、事因 不知道什么时候我在输入ls -l 命令时候的显示变成了。 -rw-r--r-- 1 bossftp ftp 6796376499 915 05:31 rac_full_20230915.gz -rw-r--r-- 1 bossftp ftp 6804104515 104 05:25 rac_full_20231024.gz -rw-r--r-- 1 bossftp ftp 6804365525 105 05:29 rac_full_202…

Git 基础知识回顾及 SVN 转 Git 自测

背景 项目开发过程中使用的版本控制工具是 SVN&#xff0c;Git 多有耳闻&#xff0c;以前也偶尔玩过几次&#xff0c;但是工作中不用&#xff0c;虽然本地也有环境&#xff0c;总是不熟练。 最近看一本网络开源技术书时&#xff0c;下载源码部署了一下&#xff0c;又温故了一…

讯飞AI算法挑战大赛-校招简历信息完整性检测挑战赛-三等奖方案

前言 本文公开了”讯飞AI算法挑战大赛-校招简历信息完整性检测挑战赛“赛道的技术方案&#xff0c;本次比赛主要采用pdf解析和特征工程的方法&#xff0c;通过使用lightgbm的树模型10折交叉验证进行二分类的任务&#xff0c;最终取得三等奖的成绩。 一、赛题任务 简历智能化…

精读《算法题 - 二叉树中的最大路径和》

今天我们看一道 leetcode hard 难度题目&#xff1a;二叉树中的最大路径和。 题目 二叉树中的 路径 被定义为一条节点序列&#xff0c;序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点&#xff0c;且不一定经过根节点…

随时随地时时刻刻使用GPT类应用

疑问 很多人说GPT的广泛使用可能会使人们失业&#xff0c;会对一些互联网公司的存活造成挑战&#xff0c;那么这个说法是真的吗&#xff1f; 这个说法并不完全准确。虽然GPT等AI技术的广泛应用可能会对某些行业和职业产生影响&#xff0c;但并不意味着它会导致人们失业或互联网…

群晖7.2版本安装Jellyfin

一、添加三方套件库 打开桌面【套件中心】&#xff0c;点击右上角的【设置】-【套件来源】-【新增】&#xff0c;添加矿神库 名称&#xff1a;我不是矿神 位置&#xff1a;https://spk7.imnks.com/ 二、安装Jellyfin 【套件中心】-搜索【Jellyfin】-【安装套件】 集显版群…

【MySQL--->索引】

文章目录 [TOC](文章目录) 一、索引概念二、B树与B树1.B树的特点:2.B树的特点:3.为什么使用B树而不使用B树 三、聚簇索引和非聚簇索引四、索引操作1.创建索引2. 删除索引3.全文索引 一、索引概念 mysql的查询的过程是从文件中提取到内存中查询,MySQL启动时会在内存中维护一个b…

LED点阵显示原理(取字模软件+Keil+Proteus)

前言 写这个的时候我还是有点生气的&#xff0c;因为发现完全按照书上面的步骤来&#xff0c;结果发现不理想&#xff0c;后面还是自己调试才解决了。-_-说多了都是泪&#xff0c;直接进入正文。 软件的操作还是参考我之前的博客。 LED数码管的静态显示与动态显示&#xff0…

LabelImg使用笔记

LabelImg使用笔记 文章目录 LabelImg使用笔记一、LabelImg简介1.1、特性1.2、LabelImg的热键 二、LabelImg安装三、3种格式的使用3.1、VOC格式标注3.2、yolo格式标注3.3、json格式 四、LabelMe 和 LabelImg适用场景 一、LabelImg简介 LabelImg 是一个用于图像标注的开源工具&a…

Ubuntu下Anaconda安装

Ubuntu下Anaconda安装 进入anaconda官网 https://www.anaconda.com/ 下载Linux64位版本&#xff1b; 将下载好的".sh"文件放入虚拟机中&#xff1b; 运行指令sudo bash Anaconda3-2023.09-0-Linux-x86_64.sh 此后会自动加载安装程序&#xff0c;中途会停止两次&am…

win11下使用VMmare设置CentOS7里面的静态IP

1&#xff0c;win11上的VMware 8 设置 2&#xff0c;选择VMmare上的虚拟网络编辑进行设置 #3&#xff0c;接下来进入虚拟机设置&#xff08;就是进入CentOS7 打开终端 右键 Open Terminal &#xff09; # 切换root su root #ksana #编辑网络配置文件 vi /etc/sysconfig/networ…

中小企业如何实现数字化转型发展?

数字化转型已成为企业未来发展的必然趋势,行业头部企业在此过程中持续投入自动化、信息化及数字化技术。虽然大多数系统投入不能仅基于短期投资回报率决策,且资源投入大见效慢、失败率也高,但数字化转型是不可逆转的过程,未来生存的企业必须是数字化的企业。 中小企业可以…

【MongoDB】索引 - 单字段索引

MongoDB支持在集合文档中的任意字段上创建索引&#xff0c;默认情况下所有的集合都有一个_id字段的索引&#xff0c;用户和应用可以新增索引用于查询和操作。 一、准备工作 这里准备一些学生数据 db.students.insertMany([{ _id: 1, name: "张三", age: 20, clas…

集群调度-02

目录 1、亲和性 1.1 节点亲和性 1.2 Pod 亲和性 1.3 键值运算关系 1.4 Pod亲和性与反亲和性 1.5 使用 Pod 反亲和性调度 2、污点(Taint) 和 容忍(Tolerations) 2.1 污点(Taint) 2.2 容忍(Tolerations) 2.3 其它注意事项 2.4 维护操作 3、Pod启动阶段&#xff08;相…

onnx-tensorrt-8.4-EA安装和使用

因项目需求要用到onnx-tensorrt&#xff0c;在安装过程中遇到不少坑&#xff0c;故这里简单记录一下&#xff0c;给大家一个参考。 首先是尝试在本机上直接安装&#xff0c;发现会出现版本对应不上一系列问题&#xff0c;故最终我还是选择在docker拉去一个镜像去配环境和使用。…

马斯克发布大模型Grok;主流AI创意生成工具图谱;Runway视频大赛获奖作品解析;DALL-E 3图像混合操作;42章经播客推荐 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; &#x1f440; 马斯克「xAI」发布首个AI大模型「Grok」 https://grok.x.ai 11月5日&#xff0c;马斯克旗下人工智能公司 xAI 发布了首款 AI 聊天产品…

Capto2024专为Mac电脑设计的屏幕录制和视频编辑软件

不得不说视频编辑功能&#xff1a;Capto提供了多种视频编辑功能&#xff0c;例如剪辑、旋转、裁剪、调整音频和视频的音量、加入水印、添加注释等&#xff0c;你能够使用Capto编辑你的视频&#xff0c;使之更加专业和生动。有目共睹的是录制完成后&#xff0c;你能够使用Capto提…

20.7 OpenSSL 套接字SSL加密传输

OpenSSL 中的 SSL 加密是通过 SSL/TLS 协议来实现的。SSL/TLS 是一种安全通信协议&#xff0c;可以保障通信双方之间的通信安全性和数据完整性。在 SSL/TLS 协议中&#xff0c;加密算法是其中最核心的组成部分之一&#xff0c;SSL可以使用各类加密算法进行密钥协商&#xff0c;…