首页 > 数据库 >多线程分批处理数据(控制服务器cpu,控制数据库cpu)

多线程分批处理数据(控制服务器cpu,控制数据库cpu)

时间:2023-10-10 17:23:52浏览次数:41  
标签:控制 return 处理 List list import 多线程 cachedThreadPool cpu

package ip;

import com.google.common.collect.Lists;
import lombok.extern.slf4j.Slf4j;

import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
* 功能描述:总思路,根据业务创建一定数量的线程池,线程池独立处理一批处理完成。
* 处理完成后再从数据库查询数据再次处理数据
*
* @Author:
* @Date: 2023/10/10 13:28
**/
@Slf4j
public abstract class ThreadUtil {

/**
* 处理
*/
public void execute(int oneThreadCount) {
ExecutorService cachedThreadPool = null;
try {
cachedThreadPool = Executors.newFixedThreadPool(10);

// 是否有数据处理
while (hasData()) {
executeByThread(cachedThreadPool, oneThreadCount);
}
} catch (Exception e) {
log.error("==execute==error={}", e);
} finally {
//关闭线程池
if (null != cachedThreadPool) {
cachedThreadPool.shutdown();
}
}
}
/**
* 核心处理类
*/
private void executeByThread(ExecutorService cachedThreadPoo, int oneThreadCount) throws InterruptedException {
List subList = getSubList();

// 数据处理完毕
if (isEmpty(subList)) {
return;
}

// 处理数据
List<List> partSubList = Lists.partition(subList, oneThreadCount);

final CountDownLatch latch = new CountDownLatch(partSubList.size());

for (List part : partSubList) {

cachedThreadPoo.execute(()-> {
// 业务核心逻辑
try {
handleLogic(part);
} catch (Exception e) {
log.error("==handleData=业务逻辑Exception={}", e);
} finally {
//保证程序计数器不管什么场景正常运行,以免引起主线程堵塞
latch.countDown();
}
});
}
//必须等待for结束后才能继续查询然后分线程去处理,防止内存溢出
latch.await();

//清理排班数据
subList.clear();
}

/**
* 是否还有数据处理
* @return
*/
public abstract boolean hasData();

/**
* 获取多线程处理的一批数据,由应用方决定
* @return
*/
public abstract List getSubList();

/**
* 对数据进行处理
* @param list
*/
public abstract void handleLogic(List list);

/**
* 分批处理
* @param list
* @return
*/
private static boolean isEmpty(List list) {
return (null == list || list.size() == 0);
}

}

标签:控制,return,处理,List,list,import,多线程,cachedThreadPool,cpu
From: https://www.cnblogs.com/Snowlanhua/p/17755241.html

相关文章

  • 在CentOS上,查看CPU、内存和磁盘的指标命令
    1.查看CPU指标:使用lscpu命令来获取CPU信息,例如:lscpu使用top命令来实时查看CPU使用率和其他相关信息,例如:top使用mpstat命令来查看CPU使用率统计信息,例如:mpstat2.查看内存指标:使用free命令来查看系统内存的使用情况,例如:free-h使用top命令来实时查看进......
  • 国标GB28181协议接入平台中,如何单独对某路监控视频流进行控制操作?
    GB/T28181协议从本质上说和ONVIF都是一样的,目的都是为了降低视频监控设备互联的难度。该协议都是基于IP网络,如果要对接,需要有相关的协议转换模块。协议之间也并不矛盾,可以实现接入上的互补。GB/T28181不仅包括设备间的级联,也包含系统的级联,故并不矛盾。如网络摄像机通过ONVIF协议......
  • 多线程使用场景三-异步调用
         ......
  • top中查看多核心的CPU
    某项目中,有一进程占用CPU是110%,排查进程是单一还是多核心都占用这么高运行top命令再按下数字1就显示多核心的占用来源:https://blog.csdn.net/m0_71252134/article/details/125634987......
  • 多线程使用场景二(数据汇总)
       ......
  • 氛围灯控制器VALS
        经纬恒润有以下两种平台化的氛围灯产品:多色氛围灯系统    基于光源零件以及配光零件,可呈现多种颜色的灯光效果,并可基于定制化控制单元,延伸出丰富的功能逻辑以及个性化、高交互性的用户体验。动态氛围灯系统    基于光源零件以及配光零件,通过单......
  • 疫情控制
    P1084[NOIP2012提高组]疫情控制我们先考虑允许走到根的做法。首先就是二分答案,然后每个军队尽可能往上跳跃,可以用倍增。(往下不优),最后检查是不是满足要求就行了。不允许到根,所以可能有的军队需要支援其他地方。我们先把不能到达根的点先原地驻扎。此时,我们发现对于一个军队......
  • 每日一题:通过css变量来控制主题
    1、定义不同主题颜色:root{--theme-color:blue;--font-size:18px;;}html[theme="dark"]{--theme-color:#000;2、通过切换html自定义属性来控制主题<!DOCTYPEhtml><htmllang="en"><head><met......
  • 智慧锅炉:工业动力锅炉2D组态控制系统
    前言锅炉是化工、炼油、发电等工业生产中必不可少的动力设备。随着工业生产规模的不断扩大,生产设备的不断创新,作为全厂动力和热源的锅炉,亦向着大容量、高参数、高效率发展。由于我国锅炉自动化控制程度不高,目前锅炉主要以人工巡检为主。但是锅炉设备位置分散,若巡检和维修都需要维......
  • python多线程
    importdatetimeimportthreadingfromtimeimportsleep#创建一个信号量,限制最多同时运行2个线程semaphore=threading.Semaphore(2)#创建一个线程锁threadLock=threading.Lock()defworker(i):withsemaphore:current_datetime=datetime.datet......