Executor FixedThreadPool 执行后会发生啥,因为 executor 没有关闭方法?
Posted
技术标签:
【中文标题】Executor FixedThreadPool 执行后会发生啥,因为 executor 没有关闭方法?【英文标题】:What happens to the Executor FixedThreadPool after execution, as executor does not have a shutdown method?Executor FixedThreadPool 执行后会发生什么,因为 executor 没有关闭方法? 【发布时间】:2021-07-30 00:05:22 【问题描述】:如果我像这样实例化一个 Executor:
private final Executor executor = Executors.newFixedThreadPool(2);
然后执行如下代码:
executor.execute(() ->
doSomeThingHere();
);
线程池在代码执行后被销毁会发生什么? Executor 没有任何关闭方法?每次我运行应用程序的过程时,我都会在我的应用程序中体验到线程的建立。这可能不是原因,但我想了解这一点并排除它。目前每次我想在后台运行代码时,我都会以这种方式实例化一个新的执行器。
【问题讨论】:
“现在每次我想在后台运行代码时,我都会以这种方式实例化一个新的执行程序”,这很可能是问题所在。只创建一个 不要分配给Executor
字段。使用ExecutorService
,它确实有一个shutdown
方法。
@Eugene 好的,谢谢,所以我应该创建一个实例并在我的代码中使用它好的,我认为可能是这种情况。
@SotiriosDelimanolis 谢谢我当然可以这样做,并在执行我的任务后调用关机。现在我会这样做,看看它是否对我的问题有帮助,我仍然想知道 Executor 的线程池中的线程是否被杀死以及何时被杀死?
在固定的线程池中,没有。当执行器关闭时,它们将被停止。
【参考方案1】:
使用ExecutorService
而不是Executor
,因为newFixedThreadPool()
返回一个ExecutorService
并且有一个shutdown
方法。
如果执行程序是使用创建守护线程的ThreadFactory
创建的(请参阅setDaemon),并且没有其他非守护线程在运行,例如主线程或 EDT,则虚拟机将被终止(停止所有线程)
【讨论】:
以上是关于Executor FixedThreadPool 执行后会发生啥,因为 executor 没有关闭方法?的主要内容,如果未能解决你的问题,请参考以下文章
如何选择FixedThreadPool和CachedThreadPool
FixedThreadPool vs CachedThreadPool:两害相权取其轻