具有corePoolSize = 0的ScheduledThreadPoolExecutor导致一个CPU核心上的100%负载

时间:2016-01-05 15:19:17

标签: java performance

给出以下ScheduledThreadPoolExecutor的配置,每五秒运行一次简单的任务:

int corePoolSize = 0;
ScheduledExecutorService executor = new ScheduledThreadPoolExecutor(corePoolSize);

Runnable task = () -> System.out.println("XXX");
executor.scheduleAtFixedRate(task, 5, 5, TimeUnit.SECONDS);

在Oracle JRE 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并因此处于空闲状态。

ScheduledThreadPoolExecutor corePoolSize = 0的行为是否为已知功能,未经验证的错误配置甚至是错误?

1 个答案:

答案 0 :(得分:11)

看起来你已经在Java 9中修复了JDK-8129861。它也可能与JDK-8022642有关。