给定的是每隔五秒运行一个简单任务的
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状态,因此处于空闲状态.
具有corePoolSize = 0的ScheduledThreadPoolExecutor的行为是否为已知功能,未经验证的错误配置甚至是错误?