我有一个带有两个@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
方法永远不会被执行?
答案 0 :(得分:0)
不,因为如果没有poll
元素,DelayQueue将返回null答案 1 :(得分:0)
如果查看了代码。如果按xml配置调度程序池
<task:executor id="executor" pool-size="10"/>
然后pool-size将成为构建ScheduledThreadPoolExecutor
ThreadPoolTaskScheduler.createExecutor line 146:
new ScheduledThreadPoolExecutor(poolSize, threadFactory, rejectedExecutionHandler);
,maximumPoolSize
将为Integer.MAX_VALUE
!
因此答案是:不,它只是一个核心池大小,如果请求它们,将创建更多线程。所以你的代码不会阻止。