前言
在我们日常生活中,我们常常会遇到有关计时器的事情。如商城类项目会在某年某月某日某时某分某秒进行特价活动,那么当时间到达这个时间点上的时候该事件就会触发。
1、Timer 类构造函数摘要
1 Timer()2 创建一个新计时器。3 Timer(booleanisDaemon)4 创建一个新计时器,可以指定其相关的线程作为守护线程运行。5 Timer(String name)6 创建一个新计时器,其相关的线程具有指定的名称7 Timer(String name, booleanisDaemon)8 创建一个新计时器,其相关的线程具有指定的名称,并且可以指定作为守护线程运行
2、Timer 类方法摘要
1 voidcancel()2 终止此计时器,丢弃所有当前已安排的任务。3 intpurge()4 从此计时器的任务队列中移除所有已取消的任务。5 voidschedule(TimerTask task, Date time)6 安排在指定的时间执行指定的任务。7 void schedule(TimerTask task, Date firstTime, longperiod)8 安排指定的任务在指定的时间开始进行重复的固定延迟执行。9 void schedule(TimerTask task, longdelay)10 安排在指定延迟后执行指定的任务。11 void schedule(TimerTask task, long delay, longperiod)12 安排指定的任务从指定的延迟后开始进行重复的固定延迟执行。13 void scheduleAtFixedRate(TimerTask task, Date firstTime, longperiod)14 安排指定的任务在指定的时间开始进行重复的固定速率执行。15 void scheduleAtFixedRate(TimerTask task, long delay, longperiod)16 安排指定的任务在指定的延迟后开始进行重复的固定速率执行。
3、TimerTask 类方法摘要
1 booleancancel()2 取消此计时器任务。3 voidrun()4 此计时器任务要执行的操作。5 longscheduledExecutionTime()6 返回此任务最近实际 执行的已安排 执行时间。
4、Timer 源码分析
1 packagejava.util;2 importdalvik.annotation.optimization.ReachabilitySensitive;3 importjava.util.Date;4 importjava.util.concurrent.atomic.AtomicInteger;5
6
7 //定时器类
8 public classTimer {9
10 //任务队列
11 @ReachabilitySensitive12 private final TaskQueue queue = newTaskQueue();13
14 //内置线程
15 @ReachabilitySensitive16 private final TimerThread thread = newTimerThread(queue);17
18 /*
19 只是重写了 finalize 方法而已,是为了垃圾回收的时候,将相应的信息回收掉,做 GC 的回补,20 也就是当 timer 线程由于某种原因死掉了,而未被 cancel,里面的队列中的信息需要清空掉,21 不过我们通常是不会考虑这个方法的,所以知道 java 写这个方法是干什么的就行了。22 */
23 private final Object threadReaper = newObject() {24 protected void finalize() throwsThrowable {25 synchronized(queue) {26 thread.newTasksMayBeScheduled = false;27 queue.notify();28 }29 }30 };31
32 private final static AtomicInteger nextSerialNumber = new AtomicInteger(0);33 private static intserialNumber() {34 returnnextSerialNumber.getAndIncrement();35 }36
37 //空的构造函数,这里会调用 Timer(String name) 给相应线程设置默认名称
38 publicTimer() {39 this("Timer-" +serialNumber());40 }41
42 //是否设置为守护线程并设置默认名称
43 public Timer(booleanisDaemon) {44 this("Timer-" +serialNumber(), isDaemon);45 }46
47 //给相应线程设置指定名称并开启线程
48 publicTimer(String name) {49 thread.setName(name);50 thread.start();51 }52
53 //设置指定名称以及是否设置为守护线程并开启线程
54 public Timer(String name, booleanisDaemon) {55 thread.setName(name);56 thread.setDaemon(isDaemon);57 thread.start();58 }59
60 //调配任务,设置任务多久后开始
61 public void schedule(TimerTask task, longdelay) {62 if (delay < 0)63 throw new IllegalArgumentException("Negative delay.");64 sched(task, System.currentTimeMillis()+delay, 0);65 }66
67 //调配任务,设置任务什么时候开始
68 public voidschedule(TimerTask task, Date time) {69 sched(task, time.getTime(), 0);70 }71
72 //调配任务,设置任务多久后开始循环执行并间