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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章