Timer与TimerTask源码阅读杂记

原创
2014/02/26 14:02
阅读数 898

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

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
4 收藏
0
分享
返回顶部
顶部