我注意到我的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
现在问题是:这些线程在等待什么? 我怀疑类似乎产生了这些线程,但我不知道究竟是什么让这些线程卡住了。
除了将课程逐行撕开并继续监视线程行为之外,我有什么办法可以找到原因吗?
答案 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。它们用于什么我无法分辨。你必须找出启动线程池的内容。也许它处理客户端请求到应用程序服务器。