一、定时器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这段时间内,没执行的任务需要被补充执行。从当前时间开始,先补充执行对应时间段内应该被执行的次数,然后任务开始继续正常执行。