业务现象:代码中有一部分代码多次嵌套循环和数据处理,执行速度很慢

解决方案:通过多线程

1:启用多线程

private final static Executor executor = Executors.newFixedThreadPool(3);

2、初始化设置count,即等待(await)count个线程或一个线程count次计数,通过工作线程来countDown计数减一,直到计数为0,await阻塞结束;目的:保证所有线程都走完
final CountDownLatch latch = new CountDownLatch(dataList.size());

3、需要重新run .需要多线程的代码写在run中
@Override
public void run() {

text
1 2 3 4 5 6 7
        //业务代码处理


        //countDown计数减一


         latch.countDown();

}

4、阻塞线程

// 等待所有工作线程结束
latch.await();

关键代码:

text
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
 private final static Executor executor = Executors.newFixedThreadPool(3);//启用多线程

 public Result getList(@RequestBody StatusDbSelectParam param){

PageHelper.startPage(param.getPageNum(), param.getPageSize());
      List<Map<String, Object>> dataList = statusDbService.selectByTime(tableName,          columnNames.toString(), param.getStartTime(), param.getEndTime());
      //初始化设置count,即等待(await)count个线程或一个线程count次计数,通过工作线程来countDown计数减一,直到计数为0,await阻塞结束
      final CountDownLatch latch = new CountDownLatch(dataList.size());
      for(int k =0;k<dataList.size();k++) {
         final int i = k;
         String finalTableName = tableName;
         executor.execute(new Runnable() {
            @Override
            public void run() {
               try {
                  Map<String, Object> map = dataList.get(i);
                  for (String pid : map.keySet()) {
                     String val = String.valueOf(map.get(pid));
                     String columPid = pid.substring(2, pid.length()).toLowerCase();
                     List<MonitorRuleEntity> list = monitorRuleService.listMonitorRule(columPid, finalTableName);
                     String status = "";
                     //循环规则数据 判断监测点是否报警 更新状态
                     for (int j = 0; j < list.size(); j++) {
                        Boolean flag = DevHealthStatusFactory.getInstance().getResultMapByRule(val, list.get(j));
                        if (flag) {
                           if (j == 0) {
                              status = "A";
                              break;
                           } else if (j == 1) {
                              status = "B";
                              break;
                           } else if (j == 2) {
                              status = "C";
                              break;
                           }
                        }
                     }
                     if (pid.equalsIgnoreCase(timeColumnName)) {
                        map.put(pid, val);
                     } else {
                        map.put(pid, val + "_" + status);
                     }
                  }
                  latch.countDown();
               } catch (Exception e) {
                  e.printStackTrace();
               }
            }
         });
      }
      try {
         // 等待所有工作线程结束
         latch.await();
      } catch (InterruptedException e) {
         e.printStackTrace();
      }
      return ResultMsg.successMsg().data(new PageInfo<>(dataList));
   }

原文地址:https://blog.csdn.net/qq_36628003/article/details/123800871?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168904443816800184167648%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=168904443816800184167648&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-25-123800871-null-null.142^v88^control_2,239^v2^insert_chatgpt&utm_term=java%E4%BC%98%E5%8C%96