以“pool”开头的Java线程是什么?

8

我遇到了一个Tomcat服务器无法正常关闭的问题。在我发出关闭命令后,我进行了线程转储,并且它看起来像这样:

http://pastebin.com/7SW4wZN9

我认为导致虚拟机无法关闭的“嫌疑”线程是名为“pool-4-thread-1”的线程。其余线程都是守护线程或内部虚拟机线程。在尝试找出此线程用途时,我注意到还有其他Java程序创建了类似名称的线程(例如,JVisualVM创建此类线程)。因此,我想知道是否有人知道这个线程是什么以及如何创建它。

无法优雅地关闭是什么意思? - Bozho
这意味着在运行shutdown.sh后,虚拟机并不会终止,需要在操作系统层面发送kill信号。 - mavroprovato
1个回答

15

这些线程很可能是由你在代码中某处创建的ExecutorService(直接或间接通过库)创建的,并且需要被关闭(例如在ServletContextListener中)。


你说得对,我已经创建了一个带有ExecutorService和一个名为该线程的Thread的测试类。你有什么想法可以找到并终止这个ExecutorService吗? - mavroprovato
很困难,因为他们正在使用默认名称,这并没有透露太多信息。你可以在应用程序运行时生成堆栈跟踪转储,也许你能捕捉到其中一个正在执行实际工作的线索。这样应该能揭示一些类名。你正在使用什么样的库?有没有可能与后台线程一起使用的东西? - Thilo
哦,我们使用了大量的东西:连接池、在线程中运行的后台任务、RMI连接等等。因此很难确定是什么导致了这个问题。但感谢您提出的想法,我会定期生成线程转储,希望能够捕捉到正在执行一些实际工作的线程。 - mavroprovato
2
使用自定义的“ThreadFactory”创建您的“ExecutorService”,并为您的池线程设置名称。 - palacsint
@palacsint:是的,那就是应该做的。但似乎没有人这样做(在这种情况下,可能是一个库创建了ExecutorService)。如果有一个API可以设置线程名前缀而不需要自定义ThreadFactory类,那将是很好的。 - Thilo
@Thilo,我知道这个帖子已经快6年了,但即使那时Google的Guava库也允许使用com.google.common.util.concurrent.ThreadFactoryBuilder设置名称,就像这样:Executors.newFixedThreadPool(2, new ThreadFactoryBuilder().setNameFormat("thread-name-%d").build()) - KirEvse

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接