如何诊断为什么ThreadPool中的所有线程都挂起从队列中获取任务?

时间:2017-10-12 07:26:34

标签: java multithreading threadpool

我们的应用是一款高负载的服务器应用。有时我们会陷入其中一个池中的所有线程都被卡住的情况。 OperationExecutor池中的所有线程看起来都非常相似:

"OperationExecutor/pool-8-thread-787" daemon prio=6 tid=0x00000000432cc800 nid=0x44ac waiting on condition [0x0000000037e3f000]
       java.lang.Thread.State: TIMED_WAITING (parking)
        at sun.misc.Unsafe.park(Native Method)
        - parking to wait for  <0x0000000548f585c8> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
        at java.util.concurrent.locks.LockSupport.parkNanos(Unknown Source)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(Unknown Source)
        at java.util.concurrent.LinkedBlockingQueue.poll(Unknown Source)
        at java.util.concurrent.ThreadPoolExecutor.getTask(Unknown Source)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
        at java.lang.Thread.run(Unknown Source)

       Locked ownable synchronizers:
        - None

所有都在等待<0x0000000548f585c8>锁定。看起来他们无法从池的队列中获得下一个任务。队列不是空的(确实很大)并且线程数是池允许的最大值(这意味着池最大化以消化队列)。我们使用LinkedBlockingQueue作为池的队列。

这里是如何初始化池的:

ThreadPoolExecutor threadPool = new ThreadPoolExecutor(200, 200, THREAD_POOL_KEEPALIVE_TIME, TimeUnit.SECONDS, new LinkedBlockingQueue(), new NamedThreadFactory(POOL_THREAD_NAME_PREFIX));

我的唯一想法是JVM在LinkedBlockingQueue方面存在一些问题,但我的另一部分说它不是这样的问题。

有人可以更好地了解我们为什么会陷入这种困境吗?

0 个答案:

没有答案