【问题标题】:Thread guarantee in spring @Scheduled tasksspring @Scheduled 任务中的线程保证
【发布时间】:2016-08-21 06:45:45
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    不,因为如果没有用于 poll 的元素,DelayQueue 会返回 null

    【讨论】:

    • 其实我在做一个take()。不是 poll()。
    【解决方案2】:

    如果查看过代码。如果通过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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-07
      • 1970-01-01
      • 2011-10-14
      • 1970-01-01
      • 2012-02-18
      • 2016-09-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多