我有一个带有两个@Scheduled方法的类,如下所示。
public class JobExecutor {
private static final DelayQueue<Job> JOB_QUEUE = new DelayQueue<>();
@Scheduled
public void run() {
Job job = JOB_QUEUE.take();
}
@Scheduled
public void fillQueue {
JOB_QUEUE.add(.....);
}
}
我正在使用一个包含20个线程的线程池。现在我使用的DelayQueue
是run
方法中的阻塞队列。是否有可能所有20个线程都被卡住读取队列(当它为空时)并且fillQueue
方法永远不会被执行?
不,因为如果没有用于轮询的元素,则DelayQueue返回null
如果看过代码。如果您通过xml配置调度程序池
<task:executor id="executor" pool-size="10"/>
然后池大小将成为构建的ScheduledThreadPoolExecutor
的corePoolSize
ThreadPoolTaskScheduler.createExecutor line 146:
new ScheduledThreadPoolExecutor(poolSize, threadFactory, rejectedExecutionHandler);
和maximumPoolSize
将是Integer.MAX_VALUE
!
因此答案是:不,它只是一个核心池大小,如果请求它们将创建更多线程。所以你的代码不会阻止。