zoukankan      html  css  js  c++  java
  • 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());
            }
        }
  • 相关阅读:
    Windows 10 Universal App 开发记录
    Windows Phone 8.1 开发会用到的方法
    Android Activity设置全屏
    Android视频录制命令screenrecord
    Android ScrollView中嵌套ListView只显示一行的解决办法
    Android 4.4.4: java.lang.SecurityException: Package com.android.settings does not belong to 1001
    自定义Android spinner样式并添加监听事件
    GSON快速实现内部类
    android的Banner轮播图框架
    Okhttp与Okhttputils的用法及区别
  • 原文地址:https://www.cnblogs.com/huanglei2010/p/11955596.html
Copyright © 2011-2022 走看看