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

Tim*_*imo 30 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
Run Code Online (Sandbox Code Playgroud)

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

我有什么办法可以找到原因,除了逐行撕开类并保持监视线程行为?

pty*_*tyx 24

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

  • 我会同意@ptyx.据推测,单击应用程序中的按钮会向Tomcat服务器发送请求.我的猜测是你有一个糟糕的配置告诉Tomcat能够处理大量的请求,因为你想成为一个企业家.Tomcat一直在它的`ThreadPoolExecutor`中创建一个新的`Thread`,因为它还没有达到`corePoolSize`.最终导致服务器崩溃,因为您已配置了大量线程但不允许足够的内存来分配这些线程所需的所有堆栈空间.但这只是我的猜测. (5认同)
  • 就是这样!我减小了池大小,现在 tomcat 似乎正确地“回收”了池线程,并且不会产生如此多的线程。谢谢,蒂姆! (2认同)

Joh*_*int 6

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

ExecutorService e = Executors.newFixedThreadPool(10);
Run Code Online (Sandbox Code Playgroud)

将创建10个将等待的线程

e.submit(new Runnable(){
  public void run(){ ...}
});
Run Code Online (Sandbox Code Playgroud)

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