参考文章
1 概述
Timer
就是一个调度器,TimerTask
是一个实现了 run() 方法
的 一个类,具体的 TimerTask
需要自己来实现
Timer timer = new Timer();
timer.schedule(new TimerTask() {
public void run() {
System.out.println("abc");
}
},20000,1000);
- Timer 的 执行流程
一个 Timer内部,包装了
一个 Thread
和一个 Task队列
。这个队列按照 最小堆 的方式对任务进行排列;而包含的线程在 Timer的构造方法
调用时被启动,这个 Thread 的run()方法
无限循环这个 Task队列。若队列为空且没有调用Timer的cancel方法,此时会一直等待,也就是死循环;如果等待完成后,队列为空,则认为发生了cancel从而跳出死循环,结束任务;循环中如果发现任务需要执行的时间小于系统时间,则需要执行,那么根据任务的时间片从新计算下次执行时间,若时间片为0代表只执行一次,则直接移除队列即可。
- TimerTask的 cancel()方法
TimerTask 的 cancel()方法 是取消单个任务的执行,即将其状态置为
CANCELLED
,这样在调用Timer的purge方法时,会将任务队列中状态为CANCELLED的任务清除,并对最小堆进行重排序
- 任务队列的实现
任务队列是用
最小堆
实现的,具体是:用一个数组实现最小堆,下标从1开始
2 Timer 的 常见方法
public void schedule(TimerTask task, long delay)
这个方法是调度一个task,经过delay(ms)后开始进行调度,仅仅调度一次
public void sch