java多线程ExecutorService使用

    ExecutorService pool = null
        try {
         
            int batchCount = 100
            int size = list.size();
            int index = size / batchCount;
            int mod = size % batchCount;

            long startTime = System.currentTimeMillis();
            def importFlag = false
            //创建线程池
            pool = Executors.newFixedThreadPool(40);
            List<Future> futureList = new ArrayList<Future>();
            for (int m = 0; m < index; m++) {
                def subList = list.subList(m * batchCount, m * batchCount + batchCount);
                Future f1 = pool.submit(new ReadSalaryExcelService(importFlag,subList,size,version));
                futureList.add(f1) //获得返回值
            }
            if (mod > 0){
                def modList = list.subList(index * batchCount, size);
                ReadSalaryExcelService thread = new ReadSalaryExcelService(importFlag,modList,size,version)
                Future f1 = pool.submit(thread);
                futureList.add(f1) //获得返回值
            }

            //关闭线程池
            pool.shutdown()
            // TODO 这个方法是统计所有线程全部执行完毕的时间
            while(true){
                if(pool.isTerminated()){
                    long end = System.currentTimeMillis();
                    System.out.println("40个线程执行用时: " + (end - startTime) + "ms,执行数据总量===="+size);
                    break;
                }
            }
        } catch (Exception e) {
            //关闭线程池
            if (pool!=null){
                pool.shutdown()
            }
            //操作失败
            dataSourceBySqlService.excuteUpdate(" update [table] set version = -1 where version = ${version} ")
            e.printStackTrace()
            throw e
        }
        return ReturnT.SUCCESS;
    }

    class ReadSalaryExcelService implements Callable {
        boolean importFlag
        def list
        int size
        def version
        public ReadSalaryExcelService(boolean importFlag,def list,int size,def version) {
            this.importFlag = importFlag
            this.list = list
            this.size = size
            this.version = version
        }

        @Override
        public Object call() {
            try {
                //业务逻辑代码
                batchBaseModel(list,size,version)
            } catch (Exception e) {
                log.error("========thirdCommunityPriceJob========" + e.message)
                importFlag = true
            }
            return importFlag
        }
    }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值