因业务需要,需从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); 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(); //主线程等待所有线程完成任务 //所有线程完成任务后的一些业务 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();//发出线程任务完成的信号 } }