我对使用 newSingleThreadExecutor 清理执行器服务有一个轻微的困惑。根据其实现,它在内部创建一个线程的线程池,如果失败,将创建一个新线程池。我正在使用 singleThreadExecutor,因为我想按顺序运行在运行时创建的任务。所以我担心的是,当系统中没有更多任务时,我是否需要关闭此执行器服务?
我已经读到执行器服务中的活动线程阻止 JVM 关闭。由于 singleThreadExecutor 也在内部创建了一个线程池,那么这是否意味着线程处于活动状态?
对不起,如果已经有疑问。
它在内部创建一个线程的线程池
正确
如果失败,将创建一个新的
它捕获了所有可抛出的,因此当您首先遇到错误时它不会失败。
所以我担心的是,当系统中没有更多任务时,我是否需要关闭此执行器服务?
您应该关闭,因为您担心资源。 如果你的线程是一个守护进程线程,它不会阻止 JVM 关闭(默认情况下它将是一个非守护进程线程。
我已经读到执行器服务中的活动线程阻止 JVM 关闭。
只有非守护程序线程会阻止 JVM 关闭。
由于 singleThreadExecutor 也在内部创建了一个线程池,那么这是否意味着线程处于活动状态?
当它正在做某事时,它将处于活动状态。它是否处于活动状态不会改变 JVM 是否关闭,只会改变线程是否是守护进程。
您可以通过提供线程工厂使线程成为守护程序线程。 我建议您这样做,即使您所做的只是设置名称,因为这样可以更轻松地调试/分析您的应用程序。
这是我之前写的一个例子 命名线程工厂