0

我有一个带有两个@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方法永远不会被执行?

4

2 回答 2

0

如果看过代码。如果通过xml配置调度器池

<task:executor id="executor" pool-size="10"/>

那么 pool-size 将成为构建的 corePoolSizeScheduledThreadPoolExecutor

ThreadPoolTaskScheduler.createExecutor line 146:
new ScheduledThreadPoolExecutor(poolSize, threadFactory, rejectedExecutionHandler);

maximumPoolSizeInteger.MAX_VALUE

因此答案是:不,它只是一个核心池大小,如果需要,将创建更多线程。所以你的代码不会阻塞。

于 2016-04-27T06:51:47.417 回答
0

不,因为如果轮询没有元素,DelayQueue 将返回 null

于 2016-04-27T06:50:36.857 回答