java多次嵌套循环查询数据库导致代码中数据处理慢的解决
作者:念旧、sunshine 发布时间:2023-10-28 22:17:50
标签:java,嵌套,循环,数据处理
业务现象
代码中有一部分代码多次嵌套循环和数据处理,执行速度很慢
解决方案
通过多线程
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() {
//业务代码处理
//countDown计数减一
latch.countDown();
}
4、阻塞线程
// 等待所有工作线程结束
latch.await();
关键代码
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


猜你喜欢
- 本文实例讲述了Android编程之在SD卡上进行文件读写操作的方法。分享给大家供大家参考,具体如下:很多知识只有真正理解掌握之后才能运用自如
- /// <summary> /// 将日期字
- 在Android开发中,View是我们必须要接触的用来展示的技术.通常情况下随着View视图的越来越复杂,整体布局的性能也会随之下降.这里介
- 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是
- 一.Android项目中引入aar包的方法我在使用高德地图的sdk的时候,选择用引入aar包的方式,然后按照网上的教程引入。但是一直报错,我
- 本文实例分析了Android中ListActivity用法。分享给大家供大家参考,具体如下:程序如下:import android.app.
- File类File类事java.io包中唯一代表磁盘文件本身的对象。File类定义了一些与平台无关的方法来操作文件,可以通过调用File类中
- android客户端生成本地验证码主要用来限制用户随意按请求按钮,其实该示例也是来对自定义view的练练手而已,先给出效果图吧其中可定制:*
- 写在前面所谓异常处理,即让一个程序运行时遇到自己无法处理的错误时抛出一个异常,希望调用者可以发现处理问题.异常处理的基本思想是简化程序的错误
- 泛型方法是使用类型参数声明的方法,如下所示:static void Swap<T>(ref T lhs, ref T rhs){
- 1.使用java.util.Properties类的load()方法示例:Java代码InputStream in = lnew Buffe
- 本文实例为大家分享了Android实现蓝牙串口通讯的具体代码,供大家参考,具体内容如下最近在弄蓝牙串口,参考了不少网上的大佬,加上自己早期对
- 一、加密介绍本文采用对称式加密算法DES和非对称式加密算法RSA结合做数据传输加密的方式。先说一下对称式加密 DES:对称式加密即使用单钥密
- Feign调用服务Headers传参在使用springcloud中经常会出现个服务调用,一般情况下会在Headers加上token的验证,那
- 如果在类路径上添加了Spring Boot Security依赖项,则Spring Boot应用程序会自动为所有HTTP端点提供基本身份验证
- 一、 WillPopScope用法WillPopScope本质是一个widget用于拦截物理按键返回事件(Android的物理返回键和iOS
- Android 中 ActivityLifecycleCallbacks的实例详解  
- 本文实例讲述了java多线程下载。分享给大家供大家参考,具体如下:使用多线程下载文件可以更快完成文件的下载,多线程下载文件之所以快,是因为其
- SpringMVC常用组件DispatcherServlet:前端控制器,不需要工程师开发,由框架提供作用:统一处理请求和响应,整个流程控制
- 本文实例讲述了Android编程之绘图canvas基本用法。分享给大家供大家参考,具体如下:MainActivity的代码如下:packag