【发布时间】:2016-01-05 23:30:54
【问题描述】:
以下是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 的行为是已知功能、未经验证的错误配置还是错误?
【问题讨论】:
标签: java performance