有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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 = 0ScheduledThreadPoolExecutor的行为是已知的特征、未经验证的错误配置,甚至是错误吗


共 (1) 个答案

  1. # 1 楼答案

    看起来您找到了JDK-8129861,这在Java9中已经修复。它也可能与JDK-8022642有关