Timer与TimerTask源码阅读杂记

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)加入任务

相关文章
相关标签/搜索