java多线程(5) ----- 定时器Timer

(欢迎关注微信公众号:深入Java底层)

JDK库中Timer类主要负责计划任务的功能,也就是在指定的时间开始执行某一个任务。Timer类的主要作用就是设置计划任务,但封装任务的类却是TimerTask类。执行计划任务的代码要放入TimerTask的子类中,因为TimeTask是一个抽象类。

5.1 方法schedule(TimerTasktask,Date time)的测试

该方法的作用是在指定的日期执行一次某一任务。

1.执行任务的时间晚于当前时间:在未来执行的效果

2.计划时间早于当前时间:提前运行效果

如果执行任务的时间早于当前时间,则立即执行task任务。

3.多个TimerTask任务及延时的测试

Timer中允许有多个TimerTask任务。TimerTask是以队列的方式一个一个被顺序执行的,所以执行的时间有可能和预期的时间不一致,因为前面的任务有可能消耗的时间较长,则后面的任务运行的时间也会被延迟。

5.2 方法schedule(TimerTasktask,Date firstTime,long period)的测试

该方法的作用是在指定的日期之后,按指定的间隔周期性地无限循环地执行某一任务。

1.     计划时间晚于当前时间:在未来执行的效果

2.     计划时间早于当前时间:提前运行的效果

如果计划时间早于当前时间,则立即执行task任务。

3.     任务执行时间被延时

4.     TimerTask类的cancle()方法

TimerTask类中的cancle()方法的作用是将自身从任务队列中清除,其他任务不受影响。

5.     Timer类的cancle()方法

和TimerTask类中的cancle()方法清除自身不同,Timer类中的cancle()方法的作用是将任务队列中的全部任务清空。

6.     Timer类的cancle()方法注意事项

Timer类中的cancle()方法有时并不一定会停止执行计划任务,而是正常执行。这是因为Timer类中的cancle()方法有时并没有争抢到queue锁,所以TimerTask类中的任务继续正常运行。

5.3 方法schedule(TimerTasktask,long delay)的测试

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

5.4 方法schedule(TimerTasktask,long delay,long period)的测试

该方法的作用是以执行schedule(TimerTask task,long delay,long period)方法当前的时间为参考时间,再此时间基础上延迟指定的毫秒数,再以某一间隔时间无限次数地执行某一任务。

凡是使用方法中带有period参数的,都是无限循环执行TimerTask中的任务。

5.5 方法scheduleAtFixedRate(TimerTasktask,Date firstTime,long period)的测试

方法schedule和方法scheduleAtFixedRate都会按顺序执行,所以不要考虑非线程安全的情况。

方法schedule和scheduleAtFixedRate主要的区别只在于不延时的情况。

使用schedule方法:如果执行任务的时间没有被延时,那么下一次任务的执行时间参考的是上一次任务的“开始”时的时间来计算。

使用scheduleAtFixedRate方法:如果执行任务的时间没有被延时,那么下一次任务的执行时间参考的是上一次任务的“结束”时的时间来计算。

延时的情况则没有区别,也就是使用schedule或scheduleAtFixedRate方法都是如果执行任务的时间被延时,那么下一次任务的执行时间参考的是上一次任务“结束”时的时间来计算。

schedule方法不具有追赶执行性,scheduleAtFixedRate方法具有追赶执行性。

(欢迎关注微信公众号:深入Java底层)


你可能感兴趣的:(java多线程)