ScheduledThreadPoolExecutor不调度的问题
开了一个ScheduledThreadPoolExecutor调度定时任务,但是发现有一定的几率线程池会不调度,所有放入线程池的任务似乎都没有执行。查看dump出来的堆信息,发现有问题的线程池任务堆积到了18000+多个,没问题的线程池则没有未执行的任务。再查看线程池中线程的栈信息,内容如下:
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x00002aaade3ed1e0> (a java.util.concurrent.locks.ReentrantLock$NonfairSync)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:158)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:747)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:778)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:1971)
at java.util.concurrent.DelayQueue.take(DelayQueue.java:164)
at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:583)
at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:576)
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:619)
我对AQS不是很了解,但是这里我看到,这个线程明明调用的是awaitNanos方法,即超时后会自己返回,但是这里最终却是调用了不会超时的park方法,除非有线程主动唤醒,否则这些线程似乎一直会被挂起不执行。
请问谁了解为什么会这样?