【发布时间】:2016-05-11 19:22:08
【问题描述】:
我面临一个奇怪的情况,我有一个线程池,maxPoolSize 为 100,队列大小为 30,corePoolSize 为 50。应用程序重新启动一段时间后,我可以在日志中看到 RejectedExecution 错误,即使线程是可用,任务被拒绝。
org.springframework.core.task.TaskRejectedException: Executor [java.util.concurrent.ThreadPoolExecutor@593a81ea[Running, pool size = 100, active threads = 3, queued tasks = 17, completed tasks = 57463]]
我多次进行线程转储,发现这个池的线程正在执行Timed_Waiting。上面的日志是正确的,根据转储也只有 3 个可运行,但我无法理解为什么其余 97 个线程对系统不可用。以下是 97 个线程常见的线程转储:
YYYThreadPoolExecutor-100" #6414 prio=5 os_prio=0 tid=0x00007f0830dce800 nid=0x3a39 waiting on condition [0x00007f064b6b5000]
java.lang.Thread.State: TIMED_WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x00007f0a32b21088> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215)
系统是具有 100 GB RAM 的 16 核机器。 16 核的当前 CPU 利用率仅为 103%,RAM 利用率为
即使我也将线程池大小增加到 500,同样的情况也会延迟到来。
以前有人遇到过这种情况吗? 提前致谢。
【问题讨论】:
标签: java multithreading