【问题标题】:What are those java threads starting with "pool"?那些以“pool”开头的java线程是什么?
【发布时间】:2011-09-26 08:37:41
【问题描述】:

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

http://pastebin.com/7SW4wZN9

我认为不允许虚拟机关闭的“嫌疑人”线程是名为“pool-4-thread-1”的线程。其余的要么是守护线程,要么是内部 VM 线程。在试图找出这个线程的用途时,我注意到还有其他 java 程序可以创建具有相似名称的线程(例如,JVisualVM 创建这样的线程)。

所以我想知道是否有人知道这个线程是什么以及如何创建它。

【问题讨论】:

  • “无法优雅地舒展”是什么意思?
  • 这意味着我运行shutdown.sh后VM没有终止。它需要操作系统级别的终止信号。

标签: java tomcat thread-dump


【解决方案1】:

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

【讨论】:

  • 你是对的,我创建了一个带有 ExecutorService 的测试类,并创建了一个具有此名称的线程。关于我如何...追捕这个 ExecutorService 并杀死它的任何想法?
  • 困难,因为他们使用的是默认名称,这不会泄露它。您可以在应用程序运行时进行堆栈跟踪转储,也许您可​​以捕捉其中一个正在执行实际工作。那应该放弃一些类名。你使用什么样的图书馆?任何可能与后台线程一起工作的东西?
  • 哦,我们正在使用大量的东西:连接池、线程中运行的后台任务、RMI 连接等等。所以很难确定是什么原因造成的。但是感谢这个想法,我会定期生成线程转储,以便我可以捕获线程做一些实际的工作。
  • 使用自定义 'ThreadFactory`es 创建您的 ExecutorServices,为您的池线程设置名称。
  • @palacsint:是的,这就是应该做的。但似乎没有人这样做(在这种情况下,它可能是一个创建 ExecutorService 的库)。如果有一个 API 来设置线程名称前缀而不需要自定义 ThreadFactory 类,那就太好了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-15
  • 1970-01-01
  • 2020-04-25
  • 1970-01-01
  • 1970-01-01
  • 2010-12-02
  • 2016-06-30
相关资源
最近更新 更多