带corePoolSize = 0的ScheduledThreadPoolExecutor导致一个CPU内核上的负载为100%

问题描述

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

解决方法

提供以下配置,ScheduledThreadPoolExecutor每5秒运行一次简单任务:

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

Runnable task = () -> System.out.println("XXX");
executor.scheduleAtFixedRate(task,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已知功能,未经验证的错误配置甚至是错误的行为?

猜你在找的技术问答相关文章

如何检查配对的蓝牙设备是打印机还是扫描仪(Android)
是否允许实体正文进行HTTP DELETE请求?
如何将ZipInputStream转换为InputStream?
java.util.logging Java 8中的变量
PowerMockito.doReturn返回null
Java中的RESTful调用
Swing / Java:如何正确使用getText和setText字符串
特殊字符和重音字符
Android Studio中的ndk.dir错误
错误“找不到主类”