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

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.

相关推荐
热点推荐
韦雪点评黄一鸣真是一针见血:少在那里爱来爱去的

韦雪点评黄一鸣真是一针见血:少在那里爱来爱去的

金牌娱乐
2024-06-15 10:26:46
他是中超最惨归化!入籍5年进不了国足 如今要彻底沉沦

他是中超最惨归化!入籍5年进不了国足 如今要彻底沉沦

球事百科吖
2024-06-15 16:31:38
媒体人:欧洲杯现场广告都是真实的,没有采用虚拟广告技术

媒体人:欧洲杯现场广告都是真实的,没有采用虚拟广告技术

直播吧
2024-06-15 18:41:04
2024年高考结束:装睡十六年的唐尚珺,终于被冷酷的现实锤醒了!

2024年高考结束:装睡十六年的唐尚珺,终于被冷酷的现实锤醒了!

舞娱天地
2024-06-13 17:23:42
事发在广州一小区内,社区将大整治电动车

事发在广州一小区内,社区将大整治电动车

小南看城市
2024-06-16 13:43:52
学霸姜萍热度不减,涟水文旅蹭热度却不报省市,网友评论区狂认领

学霸姜萍热度不减,涟水文旅蹭热度却不报省市,网友评论区狂认领

冬天来旅游
2024-06-16 01:04:05
网传临时搬运工的招聘信息,一天工作15个小时工资80,上厕所时间一天三次违者罚500

网传临时搬运工的招聘信息,一天工作15个小时工资80,上厕所时间一天三次违者罚500

可达鸭面面观
2024-06-14 22:16:19
作为一个妈妈,看到青春期儿子在自我安慰,应怎么办?

作为一个妈妈,看到青春期儿子在自我安慰,应怎么办?

户外阿崭
2024-06-16 01:00:07
男生比较大,怎样获得和谐的性生活?

男生比较大,怎样获得和谐的性生活?

许超医生
2024-05-23 10:02:12
申花正式敲定夏窗5人离队名单,中超标王领衔,两人将驰援津门虎

申花正式敲定夏窗5人离队名单,中超标王领衔,两人将驰援津门虎

评球论事
2024-06-15 19:38:11
王祖蓝香港街头开五菱晴空!网友:有钱还那么低调,开几万块的车

王祖蓝香港街头开五菱晴空!网友:有钱还那么低调,开几万块的车

元气少女侃娱乐
2024-06-14 11:36:10
打的就是精锐!中国女排逆转土耳其女排,送巴西女排登顶世界第一

打的就是精锐!中国女排逆转土耳其女排,送巴西女排登顶世界第一

直播吧
2024-06-15 22:57:41
苏恒:绝大部分支持“维持现状”的台湾人没意识到一个问题

苏恒:绝大部分支持“维持现状”的台湾人没意识到一个问题

冬瓜聊娱乐
2024-06-16 16:46:09
炸裂!高中毕业典礼家长演讲火了,网友:这才是高手,信息量很大

炸裂!高中毕业典礼家长演讲火了,网友:这才是高手,信息量很大

户外阿毽
2024-06-13 01:36:39
科普:怎么rua女友的胸,才能让她更愉悦?

科普:怎么rua女友的胸,才能让她更愉悦?

喜马拉雅主播暮霭
2024-06-13 10:03:38
乌兹别克斯坦夫人给韩国夫人上了一堂出访课,这次遇到了强对手!

乌兹别克斯坦夫人给韩国夫人上了一堂出访课,这次遇到了强对手!

小毅讲历史
2024-06-15 19:11:33
如山倒!前线形势,逼迫普京做出抉择

如山倒!前线形势,逼迫普京做出抉择

深度知局
2024-06-11 17:27:10
咋了?国安球迷赛后集体声讨,疑似不满张呈栋谢场态度

咋了?国安球迷赛后集体声讨,疑似不满张呈栋谢场态度

懂球帝
2024-06-16 10:50:26
数学天才姜萍开启大学梦,三所院校公开表态,不包括香港中文大学

数学天才姜萍开启大学梦,三所院校公开表态,不包括香港中文大学

妮子说美食
2024-06-14 20:18:00
《庆余年》明家人结局:明老太君下场极惨,夏栖飞执掌三大坊

《庆余年》明家人结局:明老太君下场极惨,夏栖飞执掌三大坊

娱记掌门
2024-06-16 12:37:02
2024-06-16 18:14:44
Java精选
Java精选
一场永远也演不完的戏
1551文章数 3855关注度
往期回顾 全部

科技要闻

iPhone 16会杀死大模型APP吗?

头条要闻

今年上半年尚未结束 已有4名正部级被查

头条要闻

今年上半年尚未结束 已有4名正部级被查

体育要闻

没人永远年轻 但青春如此无敌还是离谱了些

娱乐要闻

上影节红毯:倪妮好松弛,娜扎吸睛

财经要闻

打断妻子多根肋骨 上市公司创始人被公诉

汽车要闻

售17.68万-21.68万元 极狐阿尔法S5正式上市

态度原创

手机
旅游
本地
房产
军事航空

手机要闻

一次性购买四款荣耀折叠屏,谁这么豪横?

旅游要闻

@毕业生,江苏这些景区可享免票或优惠

本地新闻

粽情一夏|海河龙舟赛,竟然成了外国人的大party!

房产要闻

万华对面!海口今年首宗超百亩宅地,重磅挂出!

军事要闻

以军宣布在加沙南部实行"战术暂停"

无障碍浏览 进入关怀版