线程池-分页处理数据,取出重复数据的问题解决

问题点:

对于处理量较大的数据,需要用到线程池处理,来提高处理效率。而此时多线程会处理会产生对数据的重复处理。例如线程1取出id为0-100数据集合,正在处理中。此时线程2进来查询的可能是id40-140数据集合。这样对于40-60的数据就会重复处理。

解决方式:

CallerRunsPolicy —线程池拒绝策略

 ThreadPoolExecutor threadPoolExecutor = 
		 new ThreadPoolExecutor(4, 
		 6, 
		 2,
		 TimeUnit.SECONDS,
         new ArrayBlockingQueue<>(2), 
         new ThreadPoolExecutor.CallerRunsPolicy());

        Phaser phaser =new Phaser(4);
        Phaser phaser1 =new Phaser(4);
        //查询全部
         long count = XXX;
         final Integer pageSize = Math.toIntExact(count / 20000);
         for(int i=0;i<pageSize;i++){
         //如果数量小,phasr减小,避免卡死
             if(i+1>pageSize-(pageSize%4)){
                 phaser.arriveAndDeregister();
                 phaser1.arriveAndDeregister();
             }
             final int pageNum = i;
             long startNum = pageNum*20000;
             long endNum = 20000;
             //查询分页
             List<XXX> XXX = (startNum,endNum);
             threadPoolExecutor.execute(()->{
                 //进入线程准备
                 phaser.arriveAndAwaitAdvance();
                 //等待4个线程都准备好在处理数据
                 for (XXX item : XXX) {
					//对数据进行更新处理或新增处理
                 }
                 //线程到达
                 phaser1.arrive();
             });
             if((i+1)%4==0){
             //所有线程都到达
                 phaser1.awaitAdvance(phaser1.getPhase());
             }
         }
     }
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值