我面临一个奇怪的情况,我有一个线程池,其中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)
System是一个16核盒,内存为100 GB。 16个内核的当前CPU利用率仅为103%,RAM利用率<15GB。
即使我将线程池大小增加到500,同样的情况也会延迟到达。
以前有人遇到过这种情况吗? 提前谢谢。