TimerTask
实现Runnable接口。可以被Timer调度执行一次或者周期性执行的任务类。位于java.util包内。
实例属性:
int state; // 包括VIRGIN、SCHEDULED、EXECUTED、CANCELLED
long nextExecutionTime; // 下一次任务执行时刻
long period; // 周期性任务的执行时间间隔
方法:
TimerTask() 构造方法
abstract void run()
boolean cancel() 取消任务,更改任务状态state为CANCELLED。如果一次性任务还没有被执行或者是周期性任务,返回true。对于一次性任务,如果任务已经处于SCHEDULLED状态但还没有执行则永远不会被执行。而对于周期性任务,如果任务还没有被调度,则任务将不会被执行;而如果已经在执行,则执行完当前周期,但之后再也不会被执行。
这个方法可以被多次调用,但第二次以及之后的调用没有任何效果。
long scheduledExecutionTime():
返回本任务将要被执行的时刻,对于周期性任务没有什么意义。
Timer
线程安全的,多个线程可以共享一个Timer实例。
用来调度任务在将来执行一次或者周期性执行的辅助类。
每个Timer对象都对应一个后台线程(用于顺序执行timer上的任务)。
每个任务都应该能快速完成,否则如果某个TimerTask的执行占用太多
时间会影响后面的任务执行。
若想快速终止任务执行,可以调用它的cancel方法。
不提供实时保证,因为使用的Object.wait()方法。
实例属性:
TaskQueue queue = new TaskQueue(); // 任务队列,Binary Heap
TimerThread thread = new TimerThread(queue);
通过schedule方法将TimerTask加入TaskQueue
方法:
scheduleAtFixedRate:
sched(task, System.currentTimeMillis()+delay, period);
sechedule:
sched(task, System.currentTimeMillis()+delay, -period);
TimerThread extends Thread
执行具体任务的线程。
从任务队列取出executionTime最小的元素,然后判断如果是一次性任务则...
TaskQueue
任务队列类。是TimerTask的优先队列,根据nextExecutionTime排序。
基于Balanced Binary Heap实现,add、removeMin和rescheduleMin操作的时间复杂度为log(n)。getMin操作的时间复杂度为O(n)。小顶堆。
通过add(TimerTask task)加入任务