当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《具有corePoolSize=0的ScheduledThreadPoolExecutor导致一个CPU核心上的100%负载》经验,为你挑选了1个好方法。

给出以下配置,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> assylias..:

看起来你已经打JDK-8129861已经固定在Java中9.它也可以与JDK-8022642.

推荐阅读
雨天是最美
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有