chapter05 定时器Timer
1.Timer使用
Timer主要负责计划任务的功能,指定时间开始执行某一任务。
执行计划的代码要放在TimerTask的子类中。
1、schedule(TimerTask task,Date time)执行日期,执行一次任务
1)当前时间之后
|
|
执行结果,5s后出现syso内容
2)当前时间之前
表现为立即执行
schedule执行完成之后并未释放资源
由源码可以看到,构造函数Timer是新启动一个线程
|
|
同时提供了另外一个构造函数,是否以守护进程启动
|
|
|
|
以守护线程进行启动一定要保证主线程是在子线程执行完成之后才执行
可以使用sleep…
3)执行多个Task
执行多个task需要注意,如果第一个Task执行时间超过第二个task的开始,那么第二个task的开始将会延后。Task是被放入队列中,逐个执行的。
|
|
2.schedule(TimerTask task,Date firstTime,long period)
指定的日期之后,按指定的间隔周期性地无线循环地执行某一任务
1)当前时间之后执行
|
|
2)当前时间之前执行
立即执行一次,后续按照周期执行
3)任务被延时
如果任务执行时间超过时间间隔,将会执行完成后再执行,依次排队执行。
3.TimerTask的cancel()方法
将自身从任务队列中清除,其他的任务不受影响。
4. Timer的cancel()方法
Timer中的cancel()是将队列中的所有任务清空。
5.Timer的chancel()问题
Timer的chancel()方法有时不一定会停止执行计划任务,而是正常执行。这是应为Timer类中的cancel()方法有时并没有争抢到queue锁,所以TimerTask类中的任务继续正常执行
|
|
6.schedule(TimerTask task,long delay)
当前时间为基础,延迟delay毫秒数
7.schedule(TimerTask task,long delay,long period)
当前时间基础,延迟delay毫秒后,period毫秒周期执行
8.scheduleAtFixedRate(Timer task,Date firstTime,long period)
schedule和scheduleAtFixedRate都会按照顺序执行,不需要考虑线程安全问题。
schedule和scheduleAtFixedRate 主要区别在于不延时的情况
schedule以上一次任务开始时间作为参考时间
scheduleAtFixedRate 以上一次任务结束时间作为参考时间(如果不被延误)
延误的情况两者没有区别,都是以上次结束的时间来计算