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()); } }