【发布时间】:2014-08-26 07:27:14
【问题描述】:
我正在从执行器服务创建固定线程池。但是如果出现一些运行时异常或错误(OutOfMemory Error),那么线程就会死掉,线程数会不断减少,并且有一次线程数会为零,这就是所谓的静默线程杀。
一种方法是捕获 throwable(这不是一个好习惯)以避免线程终止。有什么方法可以让我们始终保持固定数量的线程。如果线程终止/死亡,则应自动生成一个新线程,以便我们始终拥有固定数量的线程。
任何建议都是值得赞赏的。
【问题讨论】:
-
你能提供一个静默线程杀死的例子吗?我无法重现它。我已经更新了this answer 中的代码,在第一个
Runnable的末尾抛出了一个OutOfMemoryError,但程序仍然运行良好——ThreadPoolExecutor只是丢弃了“旧”线程并创建了一个新线程。 -
@vanOekel 您确定 ThreadPool Executor 在旧线程死亡时创建新线程。我在任何地方都找不到这个。任何链接都会非常有帮助。
-
更新后的代码显示它发生了。所以让我们扭转局面:当池中的一个线程不再可用时,您能否证明
ThreadPoolExecutor不会启动新线程,或者提供解释何时发生这种情况的文档链接?
标签: java thread-safety threadpool threadpoolexecutor