java excel 多线程_线程池分批处理excel数据

packagecom.bds.pool.ihg_fb;importjava.util.ArrayList;importjava.util.List;importjava.util.Map;importjava.util.concurrent.ExecutorService;importjava.util.concurrent.Executors;importcn.hutool.core.io.FileUtil;importcn.hutool.poi.excel.ExcelReader;importcn.hutool.poi.excel.ExcelUtil;/*** @ClassName: PoolThread.java

* @Description: 开启线程池

*@author: jack.Lu

*@version: V1.0

* @Date : 2019年7月11日 下午2:18:35*/

public classPoolThread {

/**

*程序的入口

*/public static void main(String args[])throwsException{

readExcel();

}/*** 1.读取excel

* 2.对excel进行200分段

* 3.开启线程池

*@paramargs*/

public static voidreadExcel(){//1.读取excel

ExcelReader excelReader = ExcelUtil.getReader(FileUtil.file("C:\\Users\\admin\\Desktop\\新建文件夹\\XHS 笔记需求 0709-03.xlsx"));

List> read =excelReader.readAll();

PoolThread pl= newPoolThread();

List> excelByRead = pl.getExcelByRead(read);//500条数据,每200一条,共3组//要开启的线程数//3组

int size =excelByRead.size();

ExecutorService pool= Executors.newFixedThreadPool(size+1);

List task_list = new ArrayList();for (int i = 0; i < size; i++) {

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();

}

}

String s= "";for(DealExcel 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 = 200;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++) {

Map map =read.get(i);

String keyword= map.get("keyword")+"";

list.add(keyword);if ((i+1)%group==0) {

temp=i+1;break;

}

}

System.out.println("*****已经加入集合"+j+"次");

list_list.add(list);

}

System.out.println("########################添加结束##################################");returnlist_list;

}

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java多线程编程中,配置线程池的参数是非常重要的。根据不同的业务需求,可以设置线程池的参数来控制线程的数量和行为。根据引用中的例子,可以使用`Executors.newFixedThreadPool(int nThreads)`来创建一个固定线程数量的线程池。在这个方法中,`nThreads`参数表示线程池中的线程数量,只有这个数量的线程会被创建。然后,可以使用`pool.execute(Runnable command)`方法来提交任务给线程池执行。 在配置线程池时,需要考虑业务的性质。如果是CPU密集型的任务,比如加密、计算hash等,最佳线程数一般为CPU核心数的1-2倍。而如果是IO密集型的任务,比如读写数据库、文件、网络读写等,最佳线程数一般会大于CPU核心数很多倍。这样可以充利用IO等待时间来执行其他任务,提高程序的性能。引用中给出了一些常见的线程池特点和构造方法参数。 总之,根据业务需求和特点,合理配置线程池的参数可以提高程序的性能和效率。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Java多线程线程池的参数和配置](https://blog.csdn.net/MRZHQ/article/details/129107342)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [Java多线程线程池(合理配资源)](https://blog.csdn.net/m0_52861000/article/details/126869155)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [Java多线程线程池](https://blog.csdn.net/weixin_53611788/article/details/129602719)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值