java多线程中ArrayList应当替换为CopyOnWriteArrayList

 

 

@ApiOperation(value = "获取子公司sub,省分prov,总部hq, 全部 total  指标值中的 最高分,最低分,平均分")
    @RequestMapping(value = "/getMaxAndMinAndAverageKpiValue", method = RequestMethod.POST)
    private Map<String, Object> getMaxAndMinAndAverageKpiValue(@RequestBody KpiStatisticsReq req) {
        if (req.getKpiIds() == null) {
            return ResponseUtil.fail("请输入 kpi指标的kpiId数组");
        }
        try {
            List<HashMap<String, Object>> list = new CopyOnWriteArrayList();

            if (req.getBranch() == null) {
                req.setBranch("total");
            }
             List<String> ldapOrgCodesList1 = soaOrgWithPathBranchServiceImpl.queryLdapOrgCodesByBranch(req.getBranch());
            List<String> ldapOrgCodesList2= new ArrayList<>();
            ldapOrgCodesList2.addAll(ldapOrgCodesList1);
            if (req.getLdapOrgCodes()!=null){
                ldapOrgCodesList2.addAll(Arrays.asList(req.getLdapOrgCodes()));
            }
            final List<String> ldapOrgCodesList=ldapOrgCodesList2.stream().distinct().collect(Collectors.toList());

            ForkJoinPool forkJoinPool = new ForkJoinPool();
            for (Integer kpiId : req.getKpiIds()) {
                forkJoinPool.execute(() -> {
                    Kpi kpi = kpiServiceImpl.queryInfoByNatrualKey(kpiId);
                    // 获取 子公司编码 ldap code
                    HashMap<String, Object> datas = new HashMap<>();
                    datas.put("kpi", kpi);
                    // List<KpiValue> appKpiListAll = new ArrayList<>();
                    List<Double> doubles = new ArrayList<>();
                    KpiValue appKpiParam = new KpiValue();
                    for (String scope : ldapOrgCodesList) {
                        appKpiParam.setScope(scope);
                        appKpiParam.setKpiId(kpiId);
                        // List<KpiValue> appKpiList = kpiValueService.searchInfos(appKpiParam);
                        KpiValue kpiValue = kpiValueService.searchOne(appKpiParam);
                        if (kpiValue != null && kpiValue.getValue() != null && !kpiValue.getValue().trim().equals("")) {
                            // doubles.add(Double.parseDouble(kpiValue.getValue()));
                            doubles.add(new BigDecimal(kpiValue.getValue()).setScale(4, BigDecimal.ROUND_HALF_UP).doubleValue());
                        }
                    }
                    if (doubles.size() > 0) {
                        DoubleSummaryStatistics statistics = doubles.stream().mapToDouble(x -> x).summaryStatistics();
                        datas.put("max", BigDecimal.valueOf(statistics.getMax()).setScale(4, BigDecimal.ROUND_HALF_UP));
                        datas.put("min", BigDecimal.valueOf(statistics.getMin()).setScale(4, BigDecimal.ROUND_HALF_UP));
                        datas.put("average", BigDecimal.valueOf(statistics.getAverage()).setScale(4, BigDecimal.ROUND_HALF_UP));
                        datas.put("sum", BigDecimal.valueOf(statistics.getSum()).setScale(4, BigDecimal.ROUND_HALF_UP));
                        datas.put("count", statistics.getCount());
                    }
                    list.add(datas);
                });
            }
            while (forkJoinPool.getActiveThreadCount() != 0) {
                Thread.sleep(100);
            }
            forkJoinPool.shutdown();
            return ResponseUtil.ok(list);
        } catch (Exception e) {
            e.printStackTrace();
            LoggerUtils.error(getClass(), "查询失败!" + e.getMessage());
            return ResponseUtil.fail("查询失败!" + e.getMessage());
        }
    }

 

上一篇:5、shell-read读取控制台输入


下一篇:Python高级应用程序设计任务要求