ThreadPoolExecutor线程数量不断增长

时间:2018-02-20 10:34:25

标签: java threadpool

我们的应用程序创建了越来越多的线程。似乎所有这些线程都是由ThreadPoolExecutors创建的。

以下是此类线程的jstack输出示例:

"pool-6912-thread-1" #37152 prio=5 os_prio=0 tid=0x00007f364445c800 nid=0x71e7 waiting on condition [0x00007f3685ad9000]
   java.lang.Thread.State: WAITING (parking)                                                                                                                      
  at sun.misc.Unsafe.park(Native Method)
  - parking to wait for  <0x00000007712f2f00> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
  at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
  at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
  at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
  at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067)
  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127)
  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
  at java.lang.Thread.run(Thread.java:745)

   Locked ownable synchronizers:
  - None

"pool-6911-thread-1" #37151 prio=5 os_prio=0 tid=0x00007f3644108800 nid=0x71e6 waiting on condition [0x00007f36a0bcc000]
   java.lang.Thread.State: WAITING (parking)
  at sun.misc.Unsafe.park(Native Method)
  - parking to wait for  <0x000000077114f358> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
  at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
  at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
  at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
  at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067)
  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127)
  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
  at java.lang.Thread.run(Thread.java:745)

   Locked ownable synchronizers:
  - None

"pool-6910-thread-1" #37142 prio=5 os_prio=0 tid=0x00007f3644493000 nid=0x71a7 waiting on condition [0x00007f36225a4000]
   java.lang.Thread.State: WAITING (parking)
  at sun.misc.Unsafe.park(Native Method)
  - parking to wait for  <0x0000000770a0aa68> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
  at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
  at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
  at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
  at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067)
  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127)
  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
  at java.lang.Thread.run(Thread.java:745)

   Locked ownable synchronizers:
  - None

这似乎与问题Too many thread pools with few threads in each pool完全相同。

但是,我们所有的ThreadPool都是用

创建的
Executors.newSingleThreadScheduledExecutor();
Executors.newFixedThreadPool(1);
Executors.newScheduledThreadPool(1);

并且所有这些ExecutorServices都是始终只创建一次的类的最终字段。

我们如何才能找到这些线程的来源?不幸的是,strack跟踪没有指示哪个ExecutorService导致了这个问题。

这些ExecutorServices中是否有可能造成这种情况?

这些线程是否可以通过上述Executors的方法?

创建

有没有其他方法可以找到这些问题的原因?

0 个答案:

没有答案