通过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+线程池,按总页数分批次开多线程执行逻辑的更多相关文章

  1. js计算总页数

    前端js取余是a%b 取除数parseInt(a / b) /** * 总页数@param(总条数,每页总条数) */ function pageTotal(rowCount, pageSize) { ...

  2. word中怎样设置页码包含总页数

    一个同事做毕业论文,论文是Word格式,1-2页是封面和目录,不需要页码,第3-10页是论文内容,需要从第1页开始显示,并显示论文内容的总页数8 页.具体为页脚处显示“第*页共*页”.他让我帮忙设置一 ...

  3. sql计算总页数

    1 计算总页数方法: public int getTotalCount() {        Statement stmt = null;    //提交SQL语句对象stmt        Resu ...

  4. word2010页脚页码的总页数修改方法

    3很多时候做WORD文档时,首页和尾页通常是做为封面与封底的是不做页码统计的. 这时候就需要总页面上减去首页和尾页的数量.以下为修改总页数方法 1.打开WORD文档设置页眉页脚,页脚设置页码, 2.设 ...

  5. easyui分页时,总页数出错

    错误出现 MyBatis用easyui写后台分页代码时,出现翻页后显示总页数错误 代码如下 可能原因在于后台mappers.xml里的sql语句错误 <select id="getPr ...

  6. Java线程池几个參数的理解

     线程池几个參数的理解: 比方去火车站买票, 有10个售票窗体, 但仅仅有5个窗体对外开放. 那么对外开放的5个窗体称为核心线程数, 而最大线程数是10个窗体.假设5个窗体都被占用, 那么后来的人就必 ...

  7. C# 返回分页查询的总页数

    /// <summary> /// 返回分页查询操作的的总页数 /// </summary> /// <param name="count">总 ...

  8. js 计算总页数的最高效方式

    js 计算总页数的最高效方式 /** * [getTotalPageNum 获取页码总数] * @param {[type]} totalRecord [总记录] * @param {[type]} ...

  9. 面试官:线程池如何按照core、max、queue的执行循序去执行?(内附详细解析)

    前言 这是一个真实的面试题. 前几天一个朋友在群里分享了他刚刚面试候选者时问的问题:"线程池如何按照core.max.queue的执行循序去执行?". 我们都知道线程池中代码执行顺 ...

随机推荐

  1. caffe的网络层结构(1)

    1.concat层 该层有两个相同作用的参数: message ConcatParameter { //指定拼接的维度,默认为1即以channel通道进行拼接;支持负索引,即-1表示最后一个维度 op ...

  2. Fiddler的工作原理与主菜单介绍(一)

    1.简介: 官网:https://www.telerik.com/fiddler Fiddler是比较好用的web代理调试工具之一,它能记录并检查所有客户端与服务端的HTTP/HTTPS请求,能够设置 ...

  3. Cassandra介绍

    Cassandra介绍 Apache Cassandra 是一个开源的.分布式.无中心.弹性可扩展.高可用.容错.一致性可调.面向列的数据库.它基于Amazon Dynamo的分布式设计 Cassan ...

  4. SpringApplication.run 做了哪些事?

    SpringApplication.run一共做了两件事,分别是 创建SpringApplication对象 利用创建好的SpringApplication对象,调用run方法论 结论: 面试官: 我 ...

  5. jquery lt选择器 语法

    jquery lt选择器 语法 作用::lt 选择器选取带有小于指定 index 值的元素.index 值从 0 开始.经常与其他元素/选择器一起使用,来选择指定的组中特定序号之前的元素(如上面的例子 ...

  6. Mac 安装 MongoDB 数据库

    1. 使用 brew install mongodb 安装 (参见下图) 2. 安装成功如下图 (成功与否可参考 方框内字符) 3. 启动 MongoDB 数据库 3.1 先创建数据库存储目录 /da ...

  7. mpv播放器键盘快捷键

    作为个人认为最好用的播放器之一的MPV播放器,其开源,体积小,支持的格式多样等等非常优秀的功能.但其中也有部分麻烦的地方,因为功能太过强大,导致不知道某些功能的快捷键是什么,这就非常需要一个可以查阅的 ...

  8. JMS学习八(ActiveMQ消息持久化)

    ActiveMQ的消息持久化机制有JDBC,AMQ,KahaDB和LevelDB,还有一种内存存储的方式,由于内存不属于持久化范畴,而且如果使用内存队列,可以考虑使用更合适的产品,如ZeroMQ.所以 ...

  9. phpstorm的下载激活及定制使用和设置

    1.下载地址: 链接:https://pan.baidu.com/s/19PbZnzq0x7grgBge-iHI3w&shfl=sharepset  提取码:dnte 2.激活码获取:http ...

  10. http://www.malware-traffic-analysis.net/2018/index.html

    http://www.malware-traffic-analysis.net/2018/index.html