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

时间:2011-11-10 21:21:46

标签: java multithreading

我注意到我的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

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

除了将课程逐行撕开并继续监视线程行为之外,我有什么办法可以找到原因吗?

2 个答案:

答案 0 :(得分:24)

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

答案 1 :(得分:6)

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

ExecutorService e = Executors.newFixedThreadPool(10);

将创建10个线程,等待

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

然后将通知一个线程并调用该runnable。它们用于什么我无法分辨。你必须找出启动线程池的内容。也许它处理客户端请求到应用程序服务器。