《JAVA多线程编程核心技术》 笔记:第五章:定时器Timer

时间:2022-08-28 14:37:39

一、定时器Timer的使用

1.1 方法schedule(TimerTask task, Date time)

是否过期 执行说明 开始执行时间
time>当前时间(未过期) 在time到达时执行 time(未被延期)
time<当前时间(已过期) 当前时间立即执行 当前时间(被延期)

注意:TimeTask以队列的方式一个一个被顺序执行。

如果前一个任务执行时间过长,则后面的任务开始执行时间会被延期。和计划时间不同。(这可能也是当time<当前时间时,任务会被立即执行的原因)

1.2 方法schedule(TimerTask task, Date firstTime, long period)

开始执行时间:同上

是否过期 执行说明 开始执行时间
firstTimetime>当前时间(未过期) 在time到达时执行 time(未被延期)
firstTimetime<当前时间(已过期) 当前时间立即执行 当前时间(被延期)

下一次执行时间:同上

是否过期 执行说明 开始执行时间 实际执行间隔
任务执行时间<时间间隔
(即:下一次计划执行时间>当前时间)
【不延时】
下一次计划执行时间到达时执行 下一次计划执行时间 计划的间隔时间
任务执行时间>时间间隔
(即:下一次计划执行时间<当前时间)
【延时】
上一次执行完之后立即执行 当前时间 任务的执行时间

1.3 方法schedule(TimerTask task, long delay)的测试

方法作用:以执行 方法schedule(TimerTask task, long delay)的当前时间为参考时间,在此基础上延迟指定的毫秒数后执行一次TimerTask任务。

开始执行时间:当前时间+延迟时间

只执行一次,所以,无下一次任务执行情况

1.4 方法schedule(TimerTask task, long delay, long period)的测试

方法作用:以执行 方法schedule(TimerTask task, long delay, long period)的当前时间为参考时间,在此基础上延迟指定的毫秒数,再以某一间隔时间无限次地后执行某一任务。(只有第一次执行需要延迟delay,以后执行都是以period为周期间隔)

由于任务执行时间有延迟,所以对于下一次任务执行的开始时间。就不是很确定了。

下一次执行时间:同schedule(TimerTask task, Date firstTime, long period)的下一次执行时间

1.5 cancel()方法

方法 TimerTask类 Timer类
cancel()方法 将自身从任务队列中清除 将任务队列中的全部任务清空;
注意:如果Timer类的cancel()方法没有争抢到queue锁,那么TimerTask类中的代码逻辑会继续执行。

1.6 方法scheduleAtFixedRate(TimerTask task, Date firstTime, long period)的测试

1.6.1 基本信息和对比

方法schedule和方法scheduleAtFixedRate:都会按照顺序执行,所以不会线程不安全;

延时的情况:都是立即执行,没有什么区别。

不延时的情况。

方法 下一次任务的执行时间
schedule 参考上一次任务“开始”时的时
scheduleAtFixedRate 参考的是上一次任务“结束”时的时间

对比说明:

属性 schedule scheduleAtFixedRate
下一次任务的执行时间【延时】 立即执行 立即执行
下一次任务的执行时间【不延时】 schedule【Date】参考上一次任务“开始”时的时间
schedule【Long】参考上一次任务“结束”时的时间
因为Long表示延迟时间,Date表示开始时间
schedule【Date】参考上一次任务“开始”时的时间
schedule【Long】参考上一次任务“结束”时的时间
因为Long表示延迟时间,Date表示开始时间
追赶执行性(主要区别)

1.6.2 追赶执行性:

这么说吧,任务计算在13:00执行,每2s执行一次,现在时间是13:20。

如果不具有追赶执行性:就是在13:00-13:20这段时间内,任务没执行就算了。从当前时间开始,任务继续执行。

如果具有追赶执行性:就是在13:00-13:20这段时间内,没执行的任务需要被补充执行。从当前时间开始,先补充执行对应时间段内应该被执行的次数,然后任务开始继续正常执行。

END!