查找等待/休眠线程的原因

2022-09-01 09:01:31

我注意到我的java应用程序(在tomcat6上运行)生成了很多不会终止的线程。

所以我创建了一个线程转储,并注意到有大量的线程在等待,就像这样:

"pool-1-thread-22" prio=5 tid=101b4b000 nid=0x127122000 waiting on condition [127121000]
   java.lang.Thread.State: WAITING (parking)
    at sun.misc.Unsafe.park(Native Method)
    - parking to wait for  <6c340cee0> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:156)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1987)
    at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:399)
    at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:947)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907)
    at java.lang.Thread.run(Thread.java:680)
   Locked ownable synchronizers:
    - None

现在的问题是:这些线程在等什么?我有可疑的类,它似乎生成了这些线程,但我不知道究竟是什么让这些线程卡住。

除了逐行撕开类并继续监视线程行为之外,我还能做些什么来找到导致这种情况的原因?


答案 1

在tomcat上,他们通常请求工作线程等待某人连接。没什么可担心的。他们已准备好处理同时连接到服务器的这 100 个用户。


答案 2

这些线程是线程池的一部分。更具体地说是java.util.concurrent.ThreadPoolExecutor。线程正在等待将 Runnable/Callable 提交到池。例如

ExecutorService e = Executors.newFixedThreadPool(10);

将创建 10 个线程,这些线程将等待直到

e.submit(new Runnable(){
  public void run(){ ...}
});

然后,一个线程将收到通知并调用该可运行线程。它们被用于什么,我无法分辨。您必须找出启动线程池的原因。也许它处理客户端对应用程序服务器的请求。