Java 中线程死亡时 ThreadPoolExecutor 会发生什么

vla*_*aku 5 java multithreading executorservice threadpool

我创建了一个线程,该线程又创建了一个ThreadPoolExecutor并向其提交一些长时间运行的任务。在某些时候,原始线程由于未处理的异常/错误而死亡。执行器应该发生什么(它是该死线程的本地变量,没有对其的外部引用)?是否应该GCed?

编辑:这个问题从一开始就表述错误,但我将其保留,因为 Gray 提供了一些有关 TPE 如何工作的详细信息。

小智 2

线程就是所谓的GC 根。这意味着无法收集正在运行(或未启动)的线程。这也意味着无法收集从这些线程引用的对象,这就是为什么您可以执行诸如 、 之类的操作new Thread(new MyRunnable()).start(),或者在没有任何引用的情况下运行线程池。

如果该线程是守护程序,则当所有其他非守护程序线程都停止时,它可以自动停止。您可以拥有带有守护线程的线程池,但最好的事情是确保正确清理事物(即异常不应杀死应该最终停止并清理线程池的线程)。