各位大神好!我利用JAVA的多线程实现读取 xsl 文件并在读取完一行之后就插入数据库时,发现TOMCAT经常会卡死,之后就查看TOMCAT ,发现tomcat里面有很多空闲的线程没有结束,有大神知道怎么回事吗?
以下是部分代码
List<PredictOrderRow> rowList = excelUtil.getData();
for(int i=1;i<=rowList.size();i++) {
ExecutorService exec = Executors.newFixedThreadPool(rowList.size())
exec.submit(new PredictwaybillEX(i,columns,opId))
}
exec.shutdown()
ExecutorService exec = Executors.newFixedThreadPool(rowList.size())
放到FOR 的外边去,, 线程池 一个就行了
第一, 创建线程池为什么在for循环里面? 你现在的代码如果xsl里面有100条数据,那么将会创建100*100=10000个线程。。。oh my god!
第二, 并不是说有多少条数据就要创建多少个线程,如果xsl里面有10000条数据,难不成要创建10000个线程? 所以你这里线程池里线程个数不要太大,我觉得10个就够了吧
######回复 @找点钱过日子 : 根据实际情况来考虑线程池的大小,比如xsl里的文件平均有多少条数据,系统的配置如何等。 一般来说线程越多,同时处理的数据就越多,总的处理时间会断,但是也会带来CPU利用率的提高和JVM内存占用提高,负荷增大。######那线程池的大小应该设为多少比较好合适呢?######线程池就是用来解决短线程过多的问题。一个线程完成了一项任务后,重新放回线程池,等待执行新的任务。
######不死才怪######ExecutorService exec = Executors.newFixedThreadPool(rowList.size()) 行上,alt+↑
同时,把rowList.size()改成固定数字,10或20就行了。
主线程调用 CountDownLatch doneSignal = new CountDownLatch(rowList.size());
子线程里边sql语句执行完成后调用doneSignal.countDown();
主线程调下面方法,同步阻塞等待所有子线程都调用上面的countDown方法,设置超时时间5秒,防止主线程死等。
doneSignal.await(5, TimeUnit.SECONDS);
这样所有子线程都执行完成之后,主线程才会继续执行。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。