java线程

@Override
    public void excelImportProgramAndDetail(String awardItemCode, InputStream excelInputStream, String fileName) {
        Preconditions.checkArgument(excelInputStream != null, "excel数据不能为空");

        File configFile = new File(SalaryExcelConfig.CLASSPATH_EXCEL_PROPERTIES +
                SalaryExcelConfig.getPropertiesHolder().getString("cn.com.tisco.hr.salary.excel.json.cfg.awardDetail"));
        ExcelImporter excelImporter = ExcelImporter.excel(excelInputStream, fileName).forSheet(1);

        List<AwardProgramDetail> awardProgramDetailList = excelImporter.configSheet(configFile)
                .parseSheet()
                .validate()
                .getBeans();

        // 当导入的单项奖明细数据在1000条以上时,采用多线程的方式分批导入数据。
        if(awardProgramDetailList.size() <= 20000) {
            doImportProgramAndDetail(awardItemCode, excelImporter, awardProgramDetailList);
        } else {
            int threadCount = awardProgramDetailList.size() / 1000 + 1;

            ExecutorService executorService = Executors.newFixedThreadPool(threadCount);
            CompletionService<Boolean> completionService = new ExecutorCompletionService<>(executorService);
            List<Future<Boolean>> executionResults = new ArrayList<>(threadCount);

            for(int i = 0; i < awardProgramDetailList.size(); i++) {
                Future<Boolean> future = completionService.submit(makeProgramAndDetailImportThread(
                        awardProgramDetailList.subList(i * 1000, i * 1000 + 1000),
                        awardItemCode, excelImporter));

                executionResults.add(future);
            }

            boolean successful = true;
            for(int i=0; i < executionResults.size(); i++) {
                try {
                    Boolean result = completionService.take().get();
                    if(Boolean.FALSE.equals(result)) {
                        successful = false;
                    }
                } catch (Exception e) {
                    logger.error(e.getMessage(), e);
                }
            }

            if(! successful) {
                throw new IllegalStateException("单项奖数据导入时发生错误。");
            }
        }
    }
 private Callable<Boolean> makeProgramAndDetailImportThread(
                           final List<AwardProgramDetail> awardProgramDetails,
                           final String awardItemCode, final ExcelImporter excelImporter) {
        return new Callable<Boolean>() {
            @Override
            public Boolean call() throws Exception {
                try {
                    doImportProgramAndDetail(awardItemCode, excelImporter, awardProgramDetails);
                    return Boolean.TRUE;
                } catch (Exception e) {
                    logger.error("导入单项奖[代码=" + awardItemCode + "]时发生异常。", e);
                    excelImporter.getErrorBuilder().addSheetGlobalError(e.getMessage());
                    return Boolean.FALSE;
                }
            }
        };
    }

 

转载于:https://www.cnblogs.com/wxx516/p/8094483.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值