corePoolSize=0的java ScheduledThreadPoolExecutor会在一个CPU内核上产生100%的负载
下面给出了每五秒钟运行一个简单任务的^{
int corePoolSize = 0;
ScheduledExecutorService executor = new ScheduledThreadPoolExecutor(corePoolSize);
Runnable task = () -> System.out.println("XXX");
executor.scheduleAtFixedRate(task, 5, 5, TimeUnit.SECONDS);
在OracleJRE 1.8.0_66
上,有一个由ScheduledThreadPoolExecutor
创建的线程不断地在一个CPU内核上造成100%的负载。
调查线程转储会发现以下堆栈跟踪:
"pool-1-thread-1" - Thread t@10
java.lang.Thread.State: RUNNABLE
at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.poll(ScheduledThreadPoolExecutor.java:809)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1066)
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)
对于corePoolSize = 1
,池中仍然有一个线程。然而,线程基本上总是处于状态TIMED_WAITING
,因此处于空闲状态
带有corePoolSize = 0
的ScheduledThreadPoolExecutor
的行为是已知的特征、未经验证的错误配置,甚至是错误吗
# 1 楼答案
看起来您找到了JDK-8129861,这在Java9中已经修复。它也可能与JDK-8022642有关