java线程池(newFixedThreadPool)线程消失疑问?

使用executorService提交(submit)线程任务时,若任务执行过程中抛出未被捕获的RuntimeException或error时,会造成这条线程终止吗? 比如若原来线程池中有五条线程,抛出这样的异常时就变成了4条,以此类推,最后这个线程池中就没有线程了。是这样吗?求大神解答

ps:
就是之前自己实验了一下new了一个只有1个线程的线程池,然后不断的向线程池中提交任务,然后在任务中抛出一个RunTimeException,若是线程池中线程如问题所描述的那样会终止,那么线程池不应该再接受任务,但结果确是 线程池仍然可以不断的接受任务。所以,有些不太确定才上来求助。源码确实还没看。

=============================最后====================================
感谢各位的热心帮助,任务中抛出未被捕获的异常确实不会造成线程池的线程消失。线程池对此做了保护机制。之前产生这样错觉的原因是,我写了一个批量下载支付宝提现文件的模块,为了提升效率用到了线程池。但我发现随着时间的推移,线程池中的可用线程越来越少,直至没有了。就好像线程池中的线程消失了一样。今天发现原因了,原来是因为我没有设置HttpClient的超时时间导致的,httpClient默认的read response超时时间好像是24小时,所以遇到有问题的下载连接这个线程就被长时间占用了。其实只要加上超时时间就好了,超时抛出异常就好了。


最后吐槽一下我们的开发环境,我们是在内网开发啊~~~ 没网啊~~~ 打出的版本要在外网测试啊~~ 所以开发需要联网程序的时候,我就呵呵了~ 不能debug,出现问题根据自己的想象,在内网改好了,在通过公司流程考到外网测试,有时候改几行代码,等到拷到外网半天就过去了~~~~~
关注者
45
被浏览
6286
7 个回答
为什么不自己实验一下或是看下源代码?
上源代码:
看到try/catch没,finally里面有个afterExecute来处理异常的。这说明,线程池使用了try/catch对你的任务(task)进行保护,你的任务有异常,线程池的线程不会崩溃,而是记录一下,接着处理下一个任务。
不是。
解决这个问题是线程池的普遍需求之一。请参考源代码及java concurrency in practice。

首先,这类的问题在Stack OverFlow上问更加合适,而不应该是知乎。

不过既然你诚心诚意的问了,我那就大发慈悲的告诉你吧


就这样,你终止的只是当前线程的任务而已,跟是否销毁线程无关。

Worker thread不会因为抛出RuntimeException而被销毁,因为执行时try-catch了RuntimeException。

以ThreadPoolExecutor为例,可以看到在runWorker方法中,RuntimeException、Error、Throwable都被catch了。

如何处理RTE,可以参考我写的 博文

最近在学习Java线程池,忍不住答一发。

先说我的结论:

发生异常时,使用submit方法不会影响线程池,但使用execute方法会造成该线程销毁并创建新的线程。

========================我是分割线===========================

使用submit方法时,异常会在FutureTask的run方法被捕获,并记录下来:

在主线程调用get方法时,异常会被抛出来:

所以不会影响线程池。


使用execute方法时,虽然ThreadPoolExecutor的runWorker方法捕获到异常,但又重新抛出了:

导致了该线程的销毁并创建新线程:

以上。

源码看不看不重要,建议详细看一下 jdk 自带线程池的文档。

jdk 自带线程池中线程何时销毁是由线程池的多个参数综合决定的,所以用户提交的线程中是否抛出了异常对线程池中线程的销毁是没有影响的。

如果用户提交的线程抛出了异常会退出用户线程的 run 方法,执行线程是否需要销毁由线程池决定。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值