目前我正在使用Java中的ExecutorService
类和newFixedThreadPool
命令处理线程作业。
当我在声明shutdown()
实例后忘记执行ExecuterService
命令时,我的程序从未关闭。
我猜测ExecuterService
可能有一个内部命令关闭其线程,因为它实现了Executor
接口,它没有明确的shutdown()
命令。
我想知道ExecutorService
类和相关线程内部会发生什么,例如线程何时死亡,以及忘记shutdown()
命令会发生什么。
谢谢。
答案 0 :(得分:1)
Executors.newFixedThreadPool
创建一个具有给定数量" core"的线程池。线程,在线程池上调用shutdown()
方法之前永远不会关闭。
查看finalize
method of ThreadPoolExecutor
(通过调用Executors.newFixedThreadPool
返回的具体类):
protected void finalize() {
shutdown();
}
因此,如果ExecutorService
实例符合垃圾收集条件,则在调用finalize()
时将关闭它。
但是,与所有与finalize()
方法相关的事情一样,你不应该依赖于在任何特定时间(如果有的话)被调用。
答案 1 :(得分:0)
newFixedThreadPool
池中的线程将一直存在,直到明确关闭为止。
因此,除非你明确地调用shutdown(),否则执行程序服务对象很有可能有资格进行垃圾收集,Thread可能仍然具有执行程序的引用。
默认情况下,JVM会关闭属于主线程池的所有线程只要。