List集合分批多线程处理,同时控制最大并发
业务中,要实现数据日终同步,采用将同步文件中的数据封装成List集合分批处理加多线程的方式,根据数据量动态设置线程数,同时控制最大并发数量(业务中有IO操作,避免过大并发导致堵塞),实现效率提高
//最大线程数控制
private static int MAX_THREADS= 5;
//跑批分页大小
private static int EXPIRED_PAGE_SIZE = 30; private void dataHandler(List<SyncFileDto> list) {
//处理数据数量
int listSize = list.size();
//线程数
int runSize;
if (listSize % EXPIRED_PAGE_SIZE == 0) {
runSize = (listSize / EXPIRED_PAGE_SIZE);
} else {
runSize = (listSize / EXPIRED_PAGE_SIZE) + 1;
}
ThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(runSize);
CountDownLatch countDownLatch = new CountDownLatch(runSize);
//最大并发线程数控制
final Semaphore semaphore = new Semaphore(MAX_THREADS);
List handleList = null;
for (int i = 0; i < runSize; i++) {
if ((i + 1) == runSize) {
int startIndex = i * EXPIRED_PAGE_SIZE;
int endIndex = list.size();
handleList = list.subList(startIndex, endIndex);
} else {
int startIndex = i * EXPIRED_PAGE_SIZE;
int endIndex = (i + 1) * EXPIRED_PAGE_SIZE;
handleList = list.subList(startIndex, endIndex);
}
SyncTask task = new SyncTask(handleList, countDownLatch, semaphore);
executor.execute(task);
}
try {
countDownLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
} finally{
executor.shutdown();
}
} class SyncTask implements Runnable {
private List<SyncFileDto> list;
private CountDownLatch countDownLatch;
private Semaphore semaphore; public SyncSyncTask(List<SyncFileDto> list, CountDownLatch countDownLatch, Semaphore semaphore) {
this.list = list;
this.countDownLatch = countDownLatch;
this.semaphore = semaphore;
} @Override
public void run() {
if (!CollectionUtils.isEmpty(list)) {
try {
semaphore.acquire();
list.stream().forEach(fileDto -> {
//业务处理
}); } catch (InterruptedException e) {
e.printStackTrace();
} finally {
semaphore.release();
} }
//线程任务完成
countDownLatch.countDown();
}
}
上面是通过手动数据分片,CountDownLatch计数器闭锁和Semaphore限流的方式进行的并发控制,后期改造时发现逻辑较复杂,因此改变线程池的类型,创建可控制的线程池ThreadPoolExecutor(该线程池也是ScheduledThreadPoolExecutor的父类),自定义其属性实现跑批线程池线程数量及并发量可控。
ExecutorService fixedThreadPool = new ThreadPoolExecutor(INIT_NTHREADS, INIT_NTHREADS, 10, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(1000),
new ThreadPoolExecutor.CallerRunsPolicy());
该线程池的使用我在后面博客【地址】 中有介绍,可移步阅读。
List集合分批多线程处理,同时控制最大并发的更多相关文章
- 控制nginx并发链接数量和客户端请求nginx的速率
一.控制nginx并发链接数 ngx_http_limit_conn_module这个模块用于限制每个定义的key值的链接数,特别是单IP的链接数. 不是所有的链接数都会被计数,一个符合计数要求的连接 ...
- [原创]java WEB学习笔记93:Hibernate学习之路---Hibernate 缓存介绍,缓存级别,使用二级缓存的情况,二级缓存的架构集合缓存,二级缓存的并发策略,实现步骤,集合缓存,查询缓存,时间戳缓存
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- Node爬虫之——使用async.mapLimit控制请求并发
一般我们在写爬虫的时候,很多网站会因为你并发请求数太多当做是在恶意请求,封掉你的IP,为了防止这种情况的发生,我们一般会在代码里控制并发请求数,Node里面一般借助async模块来实现. 1. asy ...
- List集合遍历时修改元素出现并发修改异常总结
什么是并发修改异常: 当我们在遍历实现了collection接口与iterator接口的集合时(List.Set.Map), 我们可以通过遍历索引也可以通过迭代器进行遍历.在我们使用迭代器进行遍历集合 ...
- [Go] 利用有缓存channel控制同时并发的数量
如果有一个大循环,里面每一个都开启groutine,那么瞬间就会开启非常多的groutine,要解决这个问题就要用channel的阻塞特性来解决 package main import "t ...
- 通过Queue控制线程并发,并监控队列执行进度
# -*- coding:utf-8 -*- import Queue import time import threading # 需要执行的业务主体 def domain(id): time.sl ...
- Linux Shell多进程并发以及并发数控制
1. 基础知识准备 1.1. linux后台进程 Unix是一个多任务系统,允许多用户同时运行多个程序.shell的元字符&提供了在后台运行不需要键盘输入的程序的方法.输入命令后,其后紧跟&a ...
- async和enterproxy控制并发数量
聊聊并发与并行 并发我们经常提及之,不管是web server,app并发无处不在,操作系统中,指一个时间段中几个程序处于已经启动运行到完毕之间,且这几个程序都是在同一处理机上运行,并且任一个时间点只 ...
- Jmeter之仿真高并发测试-集合点
场景: 大家在使用Jmeter测试的时候应该发现了, (1)线程启动了就会直接发送测试请求:--如果要模拟在一瞬间高并发量测试的时候,需要调高线程数量,这很耗测试机器的性能,往往无法支持较大的并发数, ...
随机推荐
- 异常STATUS_FATAL_USER_CALLBACK_EXCEPTION(0xc000041d)
简介 STATUS_FATAL_USER_CALLBACK_EXCEPTION,值为0xc000041d.代表的意思是"回调期间遇到未处理的异常".它定义在 ntstatus.h头 ...
- 苹果MAC OS查看MAC地址及修改ip
一,查看mac地址 第一步: 第二步: 第三步: 二,更改IP 第一步: 第二步: 第三步: 最后点击“好”就完成了 我要这天再遮不住我眼,要这地再埋不了我心.要这天下众生都明白我意,要那诸佛都烟消云 ...
- 发布jar包到远端github仓库使用(将github仓库当作maven仓库)
今天把单点登陆的core模块搬到了github仓库 并且利用github仓库作为maven仓库 在项目中进行了引用 1. 起初看技术博客没有完全引入进来,调整了一下OK了 2. 还可以将其他模块或者工 ...
- c# 画正态分布图
/// <summary> /// 提供正态分布的数据和图片 /// </summary> public class StandardDistribution { /// &l ...
- 批归一化(Batch Normalization)
之前在几篇博客中说到了权重共享,但都觉得不够全面,这里做个专题,以后有新的理解都在此更新. 1. 减少运算只是锦上添花之前说到权重共享可以减少运算,是的,但这样说好像是可有可无,只是运算量大小的问题, ...
- CV基础知识点深入理解
BN实现: Batch Normalization学习笔记及其实现: BatchNormalization 层的实现 使用Python实现Batch normalization和卷积层 Batch N ...
- SpringBoot(十四):SpringCloud初步认识
SpringCloud是一个基于SpringBoot实现的云应用开发工具,它为开发人员提供了一些工具来快速构建分布式系统中的一些常见模式(例如配置管理.服务发现.断路器.智能路由.微代理.控制总线.一 ...
- ZooKeeper相关资料集锦
1.ZooKeeper相关概念总结 https://github.com/Snailclimb/JavaGuide/blob/master/docs/system-design/framework/Z ...
- SpringMVC异步处理 可使用的返回值类型
CallableMethodReturnValueHandler Callable.class.isAssignableFrom(returnType.getParameterType()); Def ...
- shell (7)if 表达式
文件表达式if [ -f file ] 如果文件存在if [ -d … ] 如果目录存在if [ -s file ] 如果文件存在且非空if [ -r file ] 如果文件存在且可读if [ -w ...