Timer相关类
定时执行相关类,包括java.util.Timer,以及TimerTask、还有内部类TaskQueue、TimerThread等
###java.util.TimerTask
Timer执行的调度单元。
#####常用的属性
-
nextExecutionTime
Task下一次执行时间 -
period
执行间隔时间。有负值、正值、0三种。0表示这个Task只执行一次、负值表示,计算下次执行时间时,用当前任务执行的当前时间+间隔时候计算。正值表示,第一次时,用起始时间+间隔时间得到下次执行时间,然后严格用执行时间+间隔时间,所以为负值的时候为“补偿”当前时间到初始时间之前所有的过时任务。
3、state
以及常量VIRGIN
、SCHEDULED
、EXECUTED
、CANCELLED
Task的状态。
###java.util.Timer
Timer调度执行类
TaskQueue 任务队列内部类
- 内部维护一个TimerTask数组,起始大小为128,然后以2倍扩大。
- 数组是一个二叉树结构的最小堆,每上层大小都比下层要小。并向外提供了一系列操作数据方法,同时存取任务方法中都有维护最小堆。插入队尾和弹出队首方法后,分别用
fixUp
,fixdown
重排序。还有一个heapify
重排序方法。
TimerThread 调度器线程内部类
-
newTasksMayBeScheduled
boolean字段,受queue监视器保护,表明Timer是否还有活的引用。 -
queue
所有执行任务,为TaskQueue
实例。 -
mainLoop
循环执行所有任务。其中有关于period
三种情况的不同处理方法。
常用属性
-
queue
任务队列,是一个最小堆队列。 -
thread
执行任务线程,TimerThread实例类。 -
nextSerialNumber
定时器序列号生成器
常用方法
schedule
与scheduleAtFixedRate
重载方法
两者调用sched
私有方法,根据传入的参数的不同,决定period
的值。由period
的值决定Task的规则类型。
Timer内部逻辑
计时器主要用的类有两个,一个是调度执行器Timer,一个是任务类TimerTask。
TimerTask继承了Runnable接口,是一个多线程类,根据period
值分为:
- 0,一次执行;
- 负值,按当前执行时间+间隔时间执生成下次执行时间。
- 正值,按上次执行时间+间隔时间生成下次执行时间。该方式会补偿执行从初始时间到当前时间内,有多少个间隔次数没有执行。
Timer类中,有两个内部类,一个是任务队列类。内部维护一个最小堆。一个是调度线程类TimerThread,无限循环执行任务队列中的任务。
Timer主类中,持有一个任务队列与调试线程类。主要有一系列重载的调试方法,除了之前的执行间隔机制的不同,还有初始时间的不同,根据传入的类型,可以是一个指定时间点(Date),也可以是当前时间往后延迟指定时间段(Long)。