给出以下配置,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
已知功能,未经验证的错误配置甚至是错误的行为是什么?
看起来你已经打JDK-8129861已经固定在Java中9.它也可以与JDK-8022642.