使用CyclicBarrier+线程池,按总页数分批次开多线程执行逻辑
通过CyclicBarrier+线程池的方式,同步的方式分页分批次并发高效处理逻辑,将总页数分成多个批次并发执行每页逻辑,每个批次处理DO_MAX_SIZE个页,每个批次等待DO_MAX_SIZE个页数处理完成后才执行下一个批次,并等待所有批次执行完成才处理后续逻辑
以下代码只需要在TODO处添加上自己的逻辑就可以达到处理效果
/**
* 线程池初始化,也可用其它初始化方式
*/
private ExecutorService threadPool = new ThreadPoolExecutor(, , 10L, TimeUnit.SECONDS, new LinkedBlockingDeque<Runnable>()); /**
* 最大并发数量
*/
final static int DO_MAX_SIZE = ; /**
* 线程批量并发执行数据,分页分线程处理,每页处理分配一个线程处理相关逻辑
* 最大并发线程{@code DO_MAX_SIZE}
* @param total 总条数
* @author wl
* @date 2019-08-20 18:21
*/
private void executorMultiThreadPool (Long total) throws Exception {
int startPage = , endPage = , pageSize = ;
// 按每页pageSize条算出总页数
Long pageTotal = (total + pageSize - ) / pageSize;
// 循环总页数然后按一组DO_MAX_SIZE个页来并发处理
for (int i = ; i <= pageTotal; i++) {
endPage++;
if (i % DO_MAX_SIZE != && i != pageTotal) {
continue;
}
long timeStart = System.currentTimeMillis();
int cbNum = endPage - startPage + ;
// 参数parties+1是因为给主线程添加了await,需要等待整个批次完成才执行后续逻辑;
final CyclicBarrier cb = new CyclicBarrier(cbNum + );
// 当前批次下需要处理的页数
for (int page = startPage; page <= endPage; page++) {
final int pageNum = page;
threadPool.execute(new Runnable() {
@Override
public void run() {
try {
// TODO: 处理当前页 pageNum 逻辑,此处可以查询pageNumb的数据,然后处理相关逻辑
} catch (Exception e) {
// TODO: 异常处理
} finally {
try {
// 设置等待
cb.await();
} catch (Exception e) {
logger.info(">>>>>Finally处理异常", e);
}
}
}
});
}
// 等待全部处理
try {
// 等待本批次全部处理完成
cb.await();
} catch (Exception e) {
throw e;
} finally {
logger.info(">>>>>线程池批次执行-批次完成用时[{}]", System.currentTimeMillis() - timeStart);
}
// 本批次处理完后,将结束页赋给开始
startPage = endPage + ;
}
logger.info(">>>>>线程池处理所有批次-执行完成");
}
使用CyclicBarrier+线程池,按总页数分批次开多线程执行逻辑的更多相关文章
- js计算总页数
前端js取余是a%b 取除数parseInt(a / b) /** * 总页数@param(总条数,每页总条数) */ function pageTotal(rowCount, pageSize) { ...
- word中怎样设置页码包含总页数
一个同事做毕业论文,论文是Word格式,1-2页是封面和目录,不需要页码,第3-10页是论文内容,需要从第1页开始显示,并显示论文内容的总页数8 页.具体为页脚处显示“第*页共*页”.他让我帮忙设置一 ...
- sql计算总页数
1 计算总页数方法: public int getTotalCount() { Statement stmt = null; //提交SQL语句对象stmt Resu ...
- word2010页脚页码的总页数修改方法
3很多时候做WORD文档时,首页和尾页通常是做为封面与封底的是不做页码统计的. 这时候就需要总页面上减去首页和尾页的数量.以下为修改总页数方法 1.打开WORD文档设置页眉页脚,页脚设置页码, 2.设 ...
- easyui分页时,总页数出错
错误出现 MyBatis用easyui写后台分页代码时,出现翻页后显示总页数错误 代码如下 可能原因在于后台mappers.xml里的sql语句错误 <select id="getPr ...
- Java线程池几个參数的理解
线程池几个參数的理解: 比方去火车站买票, 有10个售票窗体, 但仅仅有5个窗体对外开放. 那么对外开放的5个窗体称为核心线程数, 而最大线程数是10个窗体.假设5个窗体都被占用, 那么后来的人就必 ...
- C# 返回分页查询的总页数
/// <summary> /// 返回分页查询操作的的总页数 /// </summary> /// <param name="count">总 ...
- js 计算总页数的最高效方式
js 计算总页数的最高效方式 /** * [getTotalPageNum 获取页码总数] * @param {[type]} totalRecord [总记录] * @param {[type]} ...
- 面试官:线程池如何按照core、max、queue的执行循序去执行?(内附详细解析)
前言 这是一个真实的面试题. 前几天一个朋友在群里分享了他刚刚面试候选者时问的问题:"线程池如何按照core.max.queue的执行循序去执行?". 我们都知道线程池中代码执行顺 ...
随机推荐
- python语言特性简要记载
1.python是解释型语言,而c,c++等是编译型语言. 2.python是动态类型语言,这意味着你不需要在声明变量时指定类型. 3.Python是面向对象语言,所有允许定义类并且可以继承和组合.P ...
- SpringBoot与jackson.databind兼容报错问题
SpringBoot与jackson.databind兼容报错问题 ———————————————— 1.SpringBoot版本V2.0.0其依赖的jackson-databind版本为V2.9.4 ...
- BZOJ 3162: 独钓寒江雪 树的同构 + 组合 + 计数
Description Input Output 求一棵树编号序列不同的方案数: 令 $f[u],g[u]$ 分别表示 $u$ 选/不选 的方案数. 则 $f[u]=\prod_{v\in son ...
- Codeforces 950C Zebras ( 贪心 && 模拟 )
题意 : 给出一个 01 串,要求你将其分隔出若干个子序列 ( 每个数字只能属于某一个子序列 ) ,子序列必须满足由 0 开头和结尾,且中间需 01 交替构成.若无法做到,则输出 -1. 分析 : ...
- UVa 11235 Frequent values (RMQ && 区间出现最多次的数的次数)
题意 : 给出一个长度为 n 的不降序序列,并且给出 q 个形如(L, R)的问询,问你这个区间出现的最多次的数的次数. 分析 : 很自然的想到将区间“缩小”,例如1 1 2 3 3 3就可以变成2 ...
- ModelSerializer 使用知识点_序列化和反序列化用法区别
1.ModelSerializer 如下 from api_test.errorCode.errorCode import Statusclass RelatedbSerializer(serial ...
- ModelSerializer 使用知识点_serializer.save(project=obj) #外键一定要作为实例传入save函数,否则无法新增成功
1.有两个模型如下 A.project class Project(models.Model): """ 项目表 """ id = mode ...
- A - 地震预测
A - 地震预测 怀特先生是一名研究地震的科学家,最近他发现如果知道某一段时间内的地壳震动能量采样的最小波动值之和,可以有效地预测大地震的发生. 假设已知一段时间的n次地壳震动能量的采样值为a1,a2 ...
- 跨平台迁移数据库windows-Linux
将10.10.1.127服务器的数据库ORCL(WINDOWS)迁移到VM 10.10.10.168LINUX平台 操作系统:Windows server 2008r2 64bit CentOS L ...
- sublime text3 - vue修改data,视图无更新
ubuntu系统使用sublime text3做vue开发的时候遇到了一个问题,就是修改vue文件并保存后视图页面并不会随之修改,只有重新run dev时修改才会生效,原因没找到 猜想应该是subli ...