下面是测试类
package com.dahuatech.salescloud.performance.service.impl; import com.alibaba.excel.EasyExcel; import com.dahuatech.salescloud.core.model.auth.UserDetailDTO; import com.dahuatech.salescloud.core.utils.ExcelListenerUtil; import com.dahuatech.salescloud.performance.model.excel.TaskReportExcel; import org.apache.http.entity.ContentType; import org.springframework.mock.web.MockMultipartFile; import org.springframework.web.multipart.MultipartFile; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * @author ben.Zhou * @version 1.0 * @data 2021/3/10 10:16 */ public class PoolThread { /** * 程序的入口 */ public static void main(String args[]) throws Exception { // readExcel(); File file = new File("C:\\Users\\wb_xg20\\Desktop\\11.xlsx"); //要读取的excel文件 MultipartFile mulFile = new MockMultipartFile( "haha.jpg", //文件名 "haha.jpg", //originalName 相当于上传文件在客户机上的文件名 ContentType.APPLICATION_OCTET_STREAM.toString(), //文件类型 new FileInputStream(file) //文件流 ); // readExcel(mulFile); } /*** * 1.读取excel * 2.对excel进行1000分段 * 3.开启线程池 *@paramargs * */ public static void readExcel(MultipartFile multipartFile) {//1.读取excel InputStream inputStream = null; try { inputStream = multipartFile.getInputStream(); } catch (IOException e) { e.printStackTrace(); } ExcelListenerUtil listenerUtil = new ExcelListenerUtil(); //读取Excel EasyExcel.read(inputStream, TaskReportExcel.class, listenerUtil).sheet().doRead(); List<TaskReportExcel> read = listenerUtil.getList(); // ExcelReader excelReader = ExcelUtil.getReader(FileUtil.file("C:\\Users\\admin\\Desktop\\新建文件夹\\XHS 笔记需求 0709-03.xlsx")); //List read =excelReader.readAll(); PoolThread pl = new PoolThread(); List excelByRead = pl.getExcelByRead(read);//2000条数据,每1000一条,共3组//要开启的线程数//3组 int size = excelByRead.size(); ExecutorService pool = Executors.newFixedThreadPool(size + 1); long startTime = System.currentTimeMillis(); System.out.println("start handle time:" + startTime); List task_list = new ArrayList(); for (int i = 0; i < size; i++) { List list = (List) excelByRead.get(i); DealExcel dx = new DealExcel(i + "-", list); task_list.add(dx); pool.execute(dx); } //结束线程池 pool.shutdown(); while (true) { if (pool.isTerminated()) { break; } try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } // 结束时间 long endTime = System.currentTimeMillis(); System.out.println("end handle time:" + endTime); // 总耗时 System.out.println("total handle time:" + (endTime - startTime) + "ms"); /*String s= ""; for(Object d : task_list) { s= s+d.getThread_name()+":"+(d.getSuccess()?"成功":"失败")+";"; }*/ System.out.println("----------------------------------------------"); //System.out.println(s); } /*** * 以200为临界点 每200个放入一个String数组中,再放入List 集合中 *@paramread *@return */ private List getExcelByRead(List read) { List list_list = new ArrayList<>(); int size = read.size(); int group = 1000; int num = size / group; if (size % group != 0) {//说明不是整数101-》1+1=2 num = num + 1; } System.out.println("准备创建几个数组就是开启多少线程:" + num);//开始遍历excel int temp = 0; for (int j = 1; j <= num; j++) { List list = new ArrayList<>(); for (int i = temp; i < size; i++) { TaskReportExcel map = (TaskReportExcel) read.get(i); String keyword = map.getEmployeeNo() + ""; list.add(keyword); if ((i + 1) % group == 0) { temp = i + 1; break; } } System.out.println("*****已经加入集合" + j + "次"); list_list.add(list); } System.out.println("########################添加结束##################################"); return list_list; } }
第三总结与思考
多线程还是不错的吧,本人在开发中读取excel是用的easyExcel技术的,本来想进行优化,但是,在导出数据时,有很多限制,而且有主表和附表进行插入,所以只能在这里进行抒发代码情感。
注意:不要一味的去追求使用多线程,要注意使用场景。否则会得不偿失,引火上身奥~
上面的例子只是作者用来记录学习的
希望有错可以给我及时指出来。谢谢!