前言
有关定时任务会不会延迟执行了,可以看文章《为什么你要阻碍我,你看我扎不扎你「见鬼,定时任务延迟执行?」 - 第292篇》
https://mp.weixin.qq.com/s/G1-92E7jvvy5Ngp7nIIykg
本质上来讲,我们这一篇文章的问题的答案在上一篇已经算是给出了答案了,只是没有那么明确,这一节我们来明确的说一下。
针对这个问题「定时任务时间过长会不会影响下次的执行」,也是考虑定时任务是单线程的还是多线程的。
一、单线程
有这么一个定时任务:
-
@Scheduled(cron="10 * * * * ? ")
-
public void aTask(){
-
DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-
System.out.println(Thread.currentThread().getName()+":" +sdf.format(new Date())+" --> A任务每10秒执行一次");
-
try {
-
TimeUnit.SECONDS.sleep(70);
-
} catch (InterruptedException e) {
-
e.printStackTrace();
-
}
-
}
如果按照我们的想像的情况下,现在8:00:00的话,那么8:00:10的时候执行第一次,8:01:10的时候执行第二次,以此类推,但是在单线程的情况下却不是这样子执行的,当让我们的定时任务执行过长超过了下一次要执行的时候,那么就需要等到下一次才能执行了,我们看下执行的情况:
scheduling-1:2020-09-28 20:02:10--> A任务每10秒执行一次
scheduling-1:2020-09-28 20:04:10--> A任务每10秒执行一次
scheduling-1:2020-09-28 20:06:10--> A任务每10秒执行一次
中间总是会隔了1分钟。
二、多线程
如何开启多线程还不懂嘛,那么请阅读《为什么你要阻碍我,你看我扎不扎你「见鬼,定时任务延迟执行?」 - 第292篇》。
在多线程情况下,结果是什么样子呢?我们还是直接看下控制塔的打印在来给出结果吧:
myThread-1:2020-09-28 20:09:10--> A任务每10秒执行一次
myThread-1:2020-09-28 20:11:10--> A任务每10秒执行一次
从这里我们可以看出多线程情况下还是有影响的。
三、异步任务
如何在定时任务中使用异步任务还不懂嘛,那么请阅读《为什么你要阻碍我,你看我扎不扎你「见鬼,定时任务延迟执行?」 - 第292篇》。
在异步任务的情况下,我们看下结果:
task-1:2020-09-28 20:13:10 -->A任务每10秒执行一次
task-2:2020-09-28 20:14:10 -->A任务每10秒执行一次
从这里我们可以看出在异步任务的情况下,就不会延迟了,从上面的打印我们可以看出是不同的任务在执行下一次的定时任务。即使上一个任务还没执行完成也不影响下一次的执行了。
。。。。。。。。。。。。。。。。。
版权原因,完整文章,请参考如下:定时任务时间过长会不会影响下次的执行?- 第331篇