因业务需要,需从excel读取数据并插入数据库,由于数据量较大,耗时较长,考虑使用多线程来处理
1.读取到的list按数据量分段
2.动态创建线程
public class ScmcommissionLineServiceImpl{
//导入数据
public void importData(List list){
//500分一组
int count = 500;
int listSize = list.size();
//线程数
int RunSize = (listSize / count)+1;
ThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(RunSize);
CountDownLatch countDownLatch = new CountDownLatch(RunSize);
List newList = null ;
for (int i = 0; i < RunSize; i++) {
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(); //主线程等待所有线程完成任务
//所有线程完成任务后的一些业务
System.out.println("插入数据完成!");
.....
//关闭线程池
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();//发出线程任务完成的信号
}
}