Spring 定时之 @Scheduled,你真正了解嘛?

众所周知,@Scheduled 一个spring定时注解,让定时如此简单。

这里只想说明以下几个问题 ↓

问题说明:

此定时器分为三种类型 ↓

(1)cron                 到点执行

(2)fixedRate         间隔多久执行

(3)fixedDelay        上一次任务后多久执行

上面的概念很容易理解,通俗易记;但需要明白下面几个场景:

 - 使用cron时,如果设置为每隔1min执行一次,当上一次任务在一分钟之内没有执行完,那下一次任务会阻塞还是会执行?如果会执行什么时候执行,立即执行?

 - 同理,当使用fixedRate时,如果设置为间隔1s执行一次,一个任务在一秒未执行完,下一次是否会阻塞,下一次执行是在什么时候?

 - 多个任务同时使用cron时,他们之间的执行耗时会对其他任务有影响嘛?

 - 多个任务三种模式混用,他们之间的耗时会对其他任务产生影响嘛?

问题答案1、2答案:

弄明白问题1、2只需要看下面这张图-三种定时任务执行周期图:

 引用说明出处,此图借鉴于 https://www.cnblogs.com/zouhong/p/11332126.html

问题3、4答案:

  多个任务使用cron或者多任务混合使用三种定时类型,他们之间都是会互相影响的;eg:一个任务在执行,另一个任务即使到了执行时间也需等待前一个任务执行完再执行,因为@Scheduled 定时任务是单线程的,截图为证:

 所以如果多个任务之间不想互相影响,可以加大线程数,具体数量依任务数而定,Spring 1.5.8配置代码如下(其他版本可能不同):

     @Bean
     public TaskScheduler taskScheduler() {
          ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
          taskScheduler.setPoolSize(6);
          return taskScheduler;
     }
原文地址:https://www.cnblogs.com/lzj123/p/12024668.html