1. 基本概念
java.util.Timer:是一个实用工具类,该类用来调度一个线程(schedule a thread),使它可以在将来某一时刻执行。 Java的Timer类可以调度一个任务运行一次,或定期循环运行。 Timer tasks should complete quickly. 即定时器中的操作要尽可能花费短的时间。
java.util.TimerTask:是一个抽象类,它实现了Runnable接口。我们需要扩展该类以便创建自己的TimerTask,这个TimerTask可以被Timer调度。
注意:默认, task执行线程不是daemon线程, 任务执行完,主线程(或其他启动定时器的线程)结束时,task线程并没有结束。如果调用者想要快速终止计时器的任务执行线程,调用者应该调用timer.cancel()
方法。
public void timerTest() {
Timer myTimer = new Timer();
myTimer.schedule(new TimerTask() {
@Override
public void run() {
System.out.println("1s后运行");
myTimer.cancel(); // 需要手动cancel
}
}, 1000);
}
2. 源码解析及案例
Timer类是线程安全的,多进程不需要外部同步机制就可以共享同一个Timer对象。创建Timer对象,会创建一个java.util.TaskQueue实例,在执行定时任务时,将taskqueue对象作为锁,在指定时间间隔添加任务,在任何时刻只能有一个线程执行TimerTask。
Timer类使用对象的wait和notify方法来调度任务。
查看Timer源代码:
// TaskQueue队列,内部就是一个TimerTask[]数组
private final TaskQueue queue = new TaskQueue();
// Timer内部维持一个叫TimerThread的线程,传递TaskQueue队列
private final TimerThread thread = new TimerThread(queue);
// 创建Timer即启动线程
public Timer(String name) {
thread.setName(name);
thread.start();// 启动线程,后面有分析TimerThread的run方法
}
public void schedule(TimerTask task, long delay) {
if (delay < 0