【问题标题】:ScheduledThreadPoolExecutor with corePoolSize = 0 causes 100% load on one CPU core具有 corePoolSize = 0 的 ScheduledThreadPoolExecutor 导致一个 CPU 内核 100% 负载
【发布时间】:2016-01-05 23:30:54
【问题描述】:

以下是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,因此处于空闲状态。

ScheduledThreadPoolExecutorcorePoolSize = 0 的行为是已知功能、未经验证的错误配置还是错误?

【问题讨论】:

    标签: java performance


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2019-11-04
      • 1970-01-01
      • 2015-04-19
      • 2013-02-13
      • 2021-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多