如果不存在第3次耗时11秒的情况下,正常任务执行时间应该为:
启动于:2022-10-31 15:56:591 2022-10-31 15:57:04 开始执行, 2022-10-31 15:57:04 结束2 2022-10-31 15:57:06 开始执行, 2022-10-31 15:57:06 结束3 2022-10-31 15:57:08 开始执行, 2022-10-31 15:57:08 结束 *4 2022-10-31 15:57:10 开始执行, 2022-10-31 15:57:10 结束5 2022-10-31 15:57:12 开始执行, 2022-10-31 15:57:12 结束6 2022-10-31 15:57:14 开始执行, 2022-10-31 15:57:14 结束7 2022-10-31 15:57:16 开始执行, 2022-10-31 15:57:16 结束8 2022-10-31 15:57:18 开始执行, 2022-10-31 15:57:18 结束9 2022-10-31 15:57:20 开始执行, 2022-10-31 15:57:20 结束10 2022-10-31 15:57:22 开始执行, 2022-10-31 15:57:22 结束
使用schedule调度,第4次任务本该在15:57:10开始执行,但由于耗时11秒直到15:57:19才开始 。
而第3次任务实际是在19秒完成, 完成后又在19秒立即执行第4次,中间少了2秒间隔,第4次完成后接着开始2秒一次,变为了从21秒开始执行第5次 。
和我原本的推测不一样的是,本以为19秒完成后,第4次会隔2秒在21秒执行,没想到19秒会立即执行 。
猜测与delay参数有关,但调整了delay后仍然一样,完成的那一秒还是会马上再执行第4次任务 。
通过以上测试对比,我们可以感受到Timer中固定速率和固定延时的区别,但为了避免出错,使用Timer时应让TimerTask耗时尽可能短 。
4. 其他要点
- 以上是仅第3次任务加上了耗时11秒,如果是所有任务都耗时11秒呢?
- 如果改为schedule(TimerTask task, Date firstTime, long period)和scheduleAtFixedRate(TimerTask task, Date firstTime, long period)来调度任务,firstTime指定为10点,而当前系统时间为11点,会出现什么情况呢?
- 如果TimerTask执行过程中抛出了异常会发生什么事情?
四、调度多个TimerTask在上一节中,介绍的是一个可重复执行的TimeTask,如果执行耗时大于设定的间隔period,将会影响该TimerTask下一次执行的时间点 。
而这一节则是为了单独说明,一个Timer同时调度多个TimeTask也会互相影响 。
示例:
TimerTask task1 = new TimerTask() {private int i = 1;@Overridepublic void run() {System.out.print(i + " task1:" + DateUtil.formatNow() + " 开始执行, ");ThreadUtil.sleep(11 * 1000);System.out.println(DateUtil.formatNow() + " 结束");i++;}};TimerTask task2 = new TimerTask() {private int i = 1;@Overridepublic void run() {System.out.print(i + "task2:" + DateUtil.formatNow() + " 开始执行, ");ThreadUtil.sleep(11 * 1000);System.out.println(DateUtil.formatNow() + " 结束");i++;}};Timer timer = new Timer("timer");timer.scheduleAtFixedRate(task1, 5000, 2000);timer.scheduleAtFixedRate(task2, 5000, 2000);
输出:1 task1:2022-10-31 16:58:27 开始执行, 2022-10-31 16:58:38 结束1 task2:2022-10-31 16:58:38 开始执行, 2022-10-31 16:58:49 结束2 task2:2022-10-31 16:58:49 开始执行, 2022-10-31 16:59:00 结束2 task1:2022-10-31 16:59:00 开始执行, 2022-10-31 16:59:11 结束3 task1:2022-10-31 16:59:11 开始执行, 2022-10-31 16:59:22 结束3 task2:2022-10-31 16:59:22 开始执行, 2022-10-31 16:59:33 结束4 task2:2022-10-31 16:59:33 开始执行, 2022-10-31 16:59:44 结束4 task1:2022-10-31 16:59:44 开始执行, 2022-10-31 16:59:55 结束
可以发现,task1和task2其实都没有按照既定时间去执行任务了 。
经验总结扩展阅读
- 三 Java多线程-ThreadPool线程池
- 液晶电视机选购技巧 教你选购使用与维护电视机
- 二 Java多线程-线程关键字
- 二 Java 编码那些事
- 一 Java多线程-线程生命周期
- SpringBoot 常用注解的原理和使用
- 椰浆稀释用热水还是冻水
- 毛巾发黄怎么洗又干净又软
- 衣物洗过缩水怎么办
- 搪瓷锅第一次使用怎么开锅