网易首页 > 网易号 > 正文 申请入驻

Java 批量更新太慢?多线程+List 分段完美解决!

0
分享至

写在前面

相信不少开发者在遇到项目对数据进行批量操作的时候,都会有不少的烦恼,尤其是针对数据量极大的情况下,效率问题就直接提上了菜板。

因此,开多线程来执行批量任务是十分重要的一种批量操作思路,其实这种思路实现起来也十分简单,就拿批量更新的操作举例:

整体流程图

步骤


  • 获取需要进行的大集合A,对大集合进行拆分操作,分成N个小集合A-1 ~ A-N 。



  • 开启线程池,针对集合的大小进行调参,对小集合进行批量更新操作。



  • 对流程进行控制,控制线程执行顺序。


按照指定大小拆分集合的工具类

import com.google.common.collect.Lists;
import org.apache.commons.collections.CollectionUtils;

import java.util.List;

/**
* 拆分结合工具类,公众号:Java精选
*
* @author shiwen
*/
public class SplitListUtils {

/**
* 拆分集合
*
* @param 泛型对象
* @param resList 需要拆分的集合
* @param subListLength 每个子集合的元素个数
* @return 返回拆分后的各个集合组成的列表
* 代码里面用到了guava和common的结合工具类
**/
public static List> split(List resList, int subListLength) {
if (CollectionUtils.isEmpty(resList) || subListLength <= 0) {
return Lists.newArrayList();
}
List> ret = Lists.newArrayList();
int size = resList.size();
if (size <= subListLength) {
// 数据量不足 subListLength 指定的大小
ret.add(resList);
} else {
int pre = size / subListLength;
int last = size % subListLength;
// 前面pre个集合,每个大小都是 subListLength 个元素
for (int i = 0; i < pre; i++) {
List itemList = Lists.newArrayList();
for (int j = 0; j < subListLength; j++) {
itemList.add(resList.get(i * subListLength + j));
}
ret.add(itemList);
}
// last的进行处理
if (last > 0) {
List itemList = Lists.newArrayList();
for (int i = 0; i < last; i++) {
itemList.add(resList.get(pre * subListLength + i));
}
ret.add(itemList);
}
}
return ret;
}

// 运行代码
public static void main(String[] args) {
List list = Lists.newArrayList();
int size = 1099;
for (int i = 0; i < size; i++) {
list.add("hello-" + i);
}
// 大集合里面包含多个小集合
List> temps = split(list, 100);
int j = 0;
// 对大集合里面的每一个小集合进行操作
for (List obj : temps) {
System.out.println(String.format("row:%s -> size:%s,data:%s", ++j, obj.size(), obj));
}
}

}

开启异步执行任务的线程池

public void threadMethod() {
List updateList = new ArrayList();
// 初始化线程池, 参数一定要一定要一定要调好!!!!
ThreadPoolExecutor threadPool = new ThreadPoolExecutor(20, 50,
4, TimeUnit.SECONDS, new ArrayBlockingQueue(10), new ThreadPoolExecutor.AbortPolicy());
// 大集合拆分成N个小集合, 这里集合的size可以稍微小一些(这里我用100刚刚好), 以保证多线程异步执行, 过大容易回到单线程
List splitNList = SplitListUtils.split(totalList, 100);
// 记录单个任务的执行次数
CountDownLatch countDownLatch = new CountDownLatch(splitNList.size());
// 对拆分的集合进行批量处理, 先拆分的集合, 再多线程执行
for (List singleList : splitNList) {
// 线程池执行
threadPool.execute(new Thread(new Runnable(){
@Override
public void run() {
for (Entity yangshiwen : singleList) {
// 将每一个对象进行数据封装, 并添加到一个用于存储更新数据的list

}
}
}));
// 任务个数 - 1, 直至为0时唤醒await()
countDownLatch.countDown();
}
try {
// 让当前线程处于阻塞状态,直到锁存器计数为零
countDownLatch.await();
} catch (InterruptedException e) {
throw new BusinessLogException(ResponseEnum.FAIL);
}
// 通过mybatis的批量插入的方式来进行数据的插入, 这一步还是要做判空
if (GeneralUtil.listNotNull(updateList)) {
batchUpdateEntity(updateList);
LogUtil.info("xxxxxxxxxxxxxxx");
}
}

多线程是Java的一个难点,但是它也很有趣,听说玩得溜得起飞的人,人生都开启多线程模式了…


作者:ADAMs. https://blog.csdn.net/qq_43097201/article/details/112452391

公 众号“Java精选”所发表内容注明来源的,版权归原出处所有(无法查证版权的或者未注明出处的均来自网络,系转载,转载的目的在于传递更多信息,版权属于原作者。如有侵权,请联系,笔者会第一时间删除处理!

最近有很多人问,有没有读者交流群!加入方式很简单,公众号Java精选,回复“加群”,即可入群!

(微信小程序):3000+道面试题,包含Java基础、并发、JVM、线程、MQ系列、Redis、Spring系列、Elasticsearch、Docker、K8s、Flink、Spark、架构设计等,在线随时刷题!

------ 特别推荐 ------

特别推荐:专注分享最前沿的技术与资讯,为弯道超车做好准备及各种开源项目与高效率软件的公众号,「大咖笔记」,专注挖掘好东西,非常值得大家关注。点击下方公众号卡片关注

文章有帮助的话,点在看,转发吧!

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
场均21分!林葳!广东向同曦要签约权

场均21分!林葳!广东向同曦要签约权

常威暴DA来福
2026-07-20 12:31:41
别邪淫了!会遭天谴,会祸及子孙,会让父母蒙羞!

别邪淫了!会遭天谴,会祸及子孙,会让父母蒙羞!

阿天爱旅行
2026-07-20 13:43:03
西班牙传奇队长,送给中国记者一个“大力神杯”;阿根廷全队情绪失控,上百名记者苦等2小时,“每次输球就拒绝采访,尊重呢?”

西班牙传奇队长,送给中国记者一个“大力神杯”;阿根廷全队情绪失控,上百名记者苦等2小时,“每次输球就拒绝采访,尊重呢?”

极目新闻
2026-07-20 11:56:43
以色列建国之际,人民日报是如何报道的?

以色列建国之际,人民日报是如何报道的?

人生录
2026-07-18 00:05:10
失业的风,还是吹到了医院

失业的风,还是吹到了医院

一条要飞跃的咸鱼
2026-07-20 08:32:18
被骂百年窝囊废,可就是这个连枪都没有的胖子,护住了中国的底线

被骂百年窝囊废,可就是这个连枪都没有的胖子,护住了中国的底线

磊子讲史
2026-07-06 19:55:29
外媒:中国在短短一个下午就干掉了美国AI领先优势

外媒:中国在短短一个下午就干掉了美国AI领先优势

锅锅爱历史
2026-07-19 02:03:42
一旦阿根廷不敌西班牙,夺冠无望,将引发四个深远的连锁后果

一旦阿根廷不敌西班牙,夺冠无望,将引发四个深远的连锁后果

童叔不飙车
2026-07-20 02:40:07
最后一座炼油厂被炸,俄被打断命脉,赔光500亿,还得砸钱进口

最后一座炼油厂被炸,俄被打断命脉,赔光500亿,还得砸钱进口

启迪你的思维
2026-07-19 02:43:31
年度大片《奥德赛》在香港经历放映事故

年度大片《奥德赛》在香港经历放映事故

美剧组|人人影视
2026-07-18 20:11:57
个头更大!湖北小龙虾新品种即将上桌

个头更大!湖北小龙虾新品种即将上桌

极目新闻
2026-07-19 22:40:09
电影《想你了》票房破亿

电影《想你了》票房破亿

界面新闻
2026-07-20 14:40:08
被骗得太惨!邹市明彻底破产,幕后黑手竟是她,母亲早就看穿一切

被骗得太惨!邹市明彻底破产,幕后黑手竟是她,母亲早就看穿一切

探索新高度
2026-07-18 04:22:27
油腻导演前妻和大佬be了!?

油腻导演前妻和大佬be了!?

八卦疯叔
2026-07-20 10:33:18
下一代凯迪拉克核心平台或来自上海:中方团队自主开发,已在别克车型爆单

下一代凯迪拉克核心平台或来自上海:中方团队自主开发,已在别克车型爆单

赛场名场面
2026-07-19 00:44:32
密春雷再传噩耗!欠钱只是冰山一角,老婆董卿也救不了他

密春雷再传噩耗!欠钱只是冰山一角,老婆董卿也救不了他

社会日日鲜
2026-07-20 08:02:40
20日凌晨WTA战况,克雷吉茨科娃强势夺冠,郑钦文运气太差了

20日凌晨WTA战况,克雷吉茨科娃强势夺冠,郑钦文运气太差了

锐评利物浦
2026-07-20 10:18:48
独生子女家庭一定要立遗嘱,而且遗嘱里一定要“加上这3句话”!

独生子女家庭一定要立遗嘱,而且遗嘱里一定要“加上这3句话”!

夜深爱杂谈
2026-07-17 19:43:38
中国,有必要打一场立威之仗吗?

中国,有必要打一场立威之仗吗?

清沐执笔
2026-07-17 16:30:42
中方抓美间谍,美忙要人!他掌握的技术能让我们揪出核弹阵地?

中方抓美间谍,美忙要人!他掌握的技术能让我们揪出核弹阵地?

青青衫书生
2026-07-20 14:09:21
2026-07-20 15:27:00
Java精选
Java精选
一场永远也演不完的戏
1796文章数 3859关注度
往期回顾 全部

科技要闻

中兴阶跃荣耀齐出手,AI手机争夺系统入口

头条要闻

媒体:赖清德最怕的三件事正同时发生 台当局夜不能寐

头条要闻

媒体:赖清德最怕的三件事正同时发生 台当局夜不能寐

体育要闻

65岁肌肉男,世界杯最年长冠军主帅

娱乐要闻

44岁余文乐宣布离婚 两人育有一儿一女

财经要闻

任泽平回应"学员炒股巨亏":我没推荐个股

汽车要闻

广汽本田合作延至2038年,维持对等股比

态度原创

房产
健康
教育
时尚
本地

房产要闻

重磅!2026海口中小学招生计划,划片出炉!

刮痧也会刮出脑梗?讲个真实案例

教育要闻

我们国家的家长,其实都不懂教育

看来看去夏天还是穿T恤最合适,不用买太贵,舒适百搭又经典

本地新闻

用非遗解说决赛之争,是什么样的体验?

无障碍浏览 进入关怀版