Spring @Scheduled任务中的线程保证

时间:2016-04-27 06:24:05

标签: java spring scheduled-tasks threadpoolexecutor spring-scheduled

我有一个带有两个@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个线程的线程池。现在我使用的DelayQueuerun方法中的阻塞队列。是否有可能所有20个线程都被卡住读取队列(当它为空时)并且fillQueue方法永远不会被执行?

2 个答案:

答案 0 :(得分:0)

不,因为如果没有poll

元素,DelayQueue将返回null

答案 1 :(得分:0)

如果查看了代码。如果按xml配置调度程序池

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

然后pool-size将成为构建ScheduledThreadPoolExecutor

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

maximumPoolSize将为Integer.MAX_VALUE

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