我注意到我的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
现在的问题是:什么是这些线程在等待什么? 我怀疑类似乎产生这些线程,但我不知道究竟是什么使这些线程卡住。
有没有什么我可以做的,以找到原因,除了撕裂类逐行逐行并保持监视线程行为?
恩,他们阻塞了队列。具体来说,当一个队列为空时,LinkedBlockingQueue.take()会无限期地阻塞。 –
这是什么意思?什么队列和'()()'做的方法是什么? – Timo
呃,这是你的代码......我们不是通灵。只要告诉你线程转储告诉你什么。 –