使用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的执行循序去执行?". 我们都知道线程池中代码执行顺 ...
随机推荐
- 【NOIP2014模拟8.24】小X 的道路修建
题目 因为一场不小的地震,Y 省n 个城市之间的道路都损坏掉了,省长希望小X 将城市之间的道路重修一遍. 很多城市之间的地基都被地震破坏导致不能修路了,因此可供修建的道路只有m 条.因为施工队伍有限, ...
- springboot+mybatis日志显示SQL的最简单方法
在springBoot+Mybatis日志显示SQL的执行情况的最简单方法就是在properties新增:logging.level.cn.piesat.mapper=debug 注意:其中cn.pi ...
- webpack--第三方loader
1.配置处理css样式表的第三方loader webpack默认只能打包处理js类型的文件,无法处理非js类型的文件:要想处理*.css文件,需要手动安装一下合适的第三方loader加载器: npm ...
- 常见的NullPointerException总结
NullPointerException在这里简称为NPE 通过一些实例总结下常见的NPE问题: 1. 自动拆箱抛NPE 实体类: public class User { private String ...
- 2018百度之星B轮 degree
degree Accepts: 1581 Submissions: 3494 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/1 ...
- 用JavaServiceWrapper将JAVA程序发布成Windows服务
怎么把jar文件做成系统服务,比较多的解决方案是使用 wrapper-windows 这个软件包.这个软件包的强大之处是能把jre环境也给打进去,这个服务可以正常运行在根本没有jre环境即就没有安装J ...
- sqli-lab(14)
POST型的 双注入 0X01随便测试一下 在password输入"会报错 "#就不报错了 那么应该是“”的闭合 但是没有回显的值 只有报错的信息 那我们是不是该考虑从报错的语句 ...
- MyBatis框架之mybatis逆向工程自动生成代码
http://www.jb51.net/article/82062.htm Mybatis属于半自动ORM,在使用这个框架中,工作量最大的就是书写Mapping的映射文件,由于手动书写很容易出错,我们 ...
- Android MQTT的发布与订阅
一.MQTT介绍 链接1(菜鸟教程):https://www.runoob.com/w3cnote/mqtt-intro.html 连接2(MQTT中文网):http://mqtt.p2hp.com/ ...
- 记一次全局分区索引update调优
原始SQL: CREATE OR REPLACE PROCEDURE sp_upd_suppressed_emails( A_LIMIT_BULK IN PLS_INTEGER DEFAULT 20 ...