涉及到项目中字段添加的需求,需要对数据库字段进行修改增加处理。由于数据量大,采用一般的单线程非常耗时间,这里就展示一种解决方法,多线程并发执行任务。效率倍增。
这里主要注意两个参数。
1.预先准备使用多少个线程;
2.数据量是多少;
知道这两个参数,就可以知道每个线程需要执行的任务数 :
int count = (数据量/ 线程数)+1;
public class MultiThreadProcessing{
//导入数据
public void updateMes(){
//500分一组
int count = 500;//每个线程需要执行的任务数量
List list = list.lambdaQuery().list();//实际业务数据集合
int listSize = list.size();
//线程数
int RunSize = (listSize / count)+1;
ThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(RunSize);
CountDownLatch countDownLatch = new CountDownLatch(RunSize);
for (int i = 0; i < RunSize; i++) {
List newList = null ;
if((i+1)==RunSize){
int startIndex = (i*count);;
int endIndex = list.size();
newList =list.subList(startIndex,endIndex);
}else{
int startIndex = i*count;;
int endIndex = (i+1)*count-1;
newList =list.subList(startIndex,endIndex);
}
ImportTask task= new ImportTask (newList,countDownLatch);
executor.execute(task);
}
countDownLatch.await(); //主线程等待所有线程完成任务
//所有线程完成任务后的一些业务
log.info("插入数据完成!");
.....
//关闭线程池
executor.shutdown();
}
}
class ImportTask implements Runnable{
private List list;
private CountDownLatch countDownLatch;
public ImportTask (List list,CountDownLatch countDownLatch){
this.list = list ;
this.countDownLatch=countDownLatch;
}
@Override
public void run() {
if(null!=list){
//业务逻辑
}
countDownLatch.countDown();//发出线程任务完成的信号
}
}