根据有关Executors中newFixedThreadPool的文档,我找到了
如果任何线程由于在关闭之前执行期间的故障而终止,则在需要执行后续任务时将使用新的线程 .
当我运行我的代码时,我检测到我的固定大小的threadPool,容量为5,随着时间的推移生成线程,如 pool-1-thread-3212
,这假设是 pool-1-thread-5 or less
所以我想知道ExecutorService何时决定其中一个线程失败并启动新线程 .
任何人都可以指导我发生这种情况的原因吗?
1 回答
如果没有正确实现异常处理,则线程将会死亡,具体取决于您将任务提交给ExeuctorService的方式 .
由于您使用的是
FixedThreadPool
,因此在线程死亡时必须保留固定数量的线程 .如果使用execute而不是submit,则在未处理的异常情况下线程将死亡 .
使用
execute()
模拟异常和线程死亡的示例代码import java.util.concurrent . *;
现在检查输出中的线程名称:
现在只需在提交
Runnable
任务时将execute
替换为submit
. 将吞下异常并输出如下:(您只能看到两个线程,因为FixedThreadPool大小为2)有关线程创建的更多详细信息,请参阅此grepcode链接: