【发布时间】:2011-12-26 13:16:09
【问题描述】:
我注意到我的 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()在队列为空时会无限期阻塞。 -
这是什么意思?什么队列以及该方法
take()做了什么? -
呃,这是你的密码……我们不是通灵者。只是告诉你线程转储告诉你什么。
-
?我肯定没有写 java.util.*。
-
你有一个线程。它正在使用阻塞队列。那个队列是空的。您的线程正在阻止尝试从中读取,因为它是空的。除非将某些内容添加到队列中,否则它将永远阻塞在那里。我们看不到您的代码。没有你的代码,没有人能帮助你。
标签: java multithreading