TimerTask java
实现Runnable接口。能够被Timer调度执行一次或者周期性执行的任务类。位于java.util包内。 安全
实例属性: spa
int state; // 包括VIRGIN、SCHEDULED、EXECUTED、CANCELLED 线程
long nextExecutionTime; // 下一次任务执行时刻 对象
long period; // 周期性任务的执行时间间隔 排序
方法: 接口
TimerTask() 构造方法 队列
abstract void run() rem
boolean cancel() 取消任务,更改任务状态state为CANCELLED。若是一次性任务尚未被执行或者是周期性任务,返回true。对于一次性任务,若是任务已经处于SCHEDULLED状态但还没有执行则永远不会被执行。而对于周期性任务,若是任务尚未被调度,则任务将不会被执行;而若是已经在执行,则执行完当前周期,但以后不再会被执行。 get
这个方法能够被屡次调用,但第二次以及以后的调用没有任何效果。
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)加入任务