@Scheduled 多线程以及放置位置的问题

1 @Scheduled是不是必须放在spring管理的bean里?譬如有@Component @Controller @Service 注解的类里,放其他地方不起作用?

2 多线程任务下,例如下面所示,doTask1和doTask2之间可以异步进行,但是假如doTask1的上一次任务还没完成,5秒时间已过,下一次任务来了,是会开新线程进行还是等待上一次任务完成再进行?也就是说doTask1自己本身的任务之间是异步的还是同步的?如果是异步,如何同步?

   @Componenet
   @EnableAsync
   class MyClass{
        
       @Async
       @Scheduled(cron = "0/5 * *  * * ? ")
       void doTask1{
          ...
       }

       @Async
       @Scheduled(cron = "0 0/3 * * * ?")
       void doTask2{
          ...
       }
   
阅读 5.5k
3 个回答

1,因为 @Scheduled 是spring的一个功能,要使用需要被扫描到才行行,所以才需要@Component等注解。
2,定时任务有两种,一种是间隔多久执行一次,这种必须要等到上一个任务执行完毕才会开始下一个任务,另一种是在特定的时间执行,比如每小时的01分执行,即使上一个任务没有完成也会开始下一个任务。

谢邀,@范闲 回答的已经很好了,我就不啰嗦了。

问题1: 必须是Spring Bean才可以
问题2: 定时任务执行扯不到“同步”“异步”上,你对这个东西的概念理解存在问题。
@Scheduled有两种:

  1. fixedRate,固定频率执行,不等待上一次执行结束,也就是说可能会存在重叠的情况
  2. fixedDelay,固定间隔执行,上一次执行结束后等待若干时间再执行下一次

我认为cron相当于fixedRate,这个你自己试试就知道了。

但是因为@Scheduled的执行需要Executor,默认是ScheduledThreadPool,所以要看线程池大小是多少。如果线程池大小就是1,那么就算是fixedRate也会表现得和fixedDelay类似,即等上一个执行完毕后执行下一个。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题