Timer 和 TimerTask类
java.util提供的一个有趣并且有用的特性就是在将来某些时候安排执行任务的能力。支持这一功能的类是Timer和TimerTask。使用这些类,可以创建在后台运行、等待特定时刻的线程。当时间到达时,执行链接到线程的任务。有各种选项可以用来安排重复执行以及在特定时期运行的任务。尽管使用Thread类总是可以手动创建在特定时间运行的任务,但是Timer和TimerTask极大地简化了这个过程。
Timer和TimerTask可以一同工作。Timer类用于安排任务,被安排的任务必须是TimerTask类的实例。因此,为了安排任务,首先必须创建TimerTask对象,然后使用Timer实例安排任务的执行。
TimerTask实现了Runnable接口,因此能够用于创建执行的线程。TimerTask的构造函数如下所示:
protected TimerTask()
表1显示了TimerTask类定义的方法。注意run()方法是抽象的,这意味着它必须被重写。run()方法包含将被执行的代码,该方法是由Runnable接口定义的。因此,创建定时任务最简单的方法就是扩展TimerTask类并重写run()方法。
方 法 | 描 述 |
---|---|
boolean cancel() | 终止任务。如果成功阻止任务的执行,就返回true;否则返回false |
abstract void run() | 包含定时任务的代码 |
long scheduledExecutionTime() | 返回所安排任务最后一次执行的时间 |
创建任务后,可以使用Timer类的对象安排任务的执行。Timer类的构造函数如下所示:
Timer()
Timer(boolean DThread)
Timer(String tName)
Timer(String tName,boolean DThread)
第1个版本创建的Timer对象作为正常线程运行。对于第2个版本,如果DThread为true,就执行守护线程。只要程序的剩余部分仍然在继续执行,守护线程就会执行。第3个和第4个版本允许为Timer线程指定名称。表2显示了Timer类定义的方法。
方 法 | 描 述 |
---|---|
void cancel() | 取消定时器线程 |
int purge() | 从定时任务中删除已取消的任务 |
void schedule(TimerTask TTask,long wait) | TTask被安排在由参数wait传递的周期之后执行,wait参数的单位是毫秒 |
void schedule(TimerTask TTask,long wait,long repeat) | TTask被安排在由参数wait传递的周期之后执行,然后任务再以repeat指定的时间间隔重复执行。wait和repeat参数的单位都是毫秒 |
void schedule(TimerTask TTask,Date targetTime) | TTask被安排在由targetTime指定的时间执行 |
void schedule(TimeTask TTask,Date targetTime,long repeat) | TTask被安排在由targetTime指定的时间执行,然后任务再以repeat传递的时间间隔重复执行。repeat参数的单位是毫秒 |
void scheduleAtFixedRate(TimerTask TTask,long wait,long repeat) | TTask被安排在由参数wait传递的周期之后执行,然后任务再以repeat指定的时间间隔重复执行。wait和repeat参数的单位都是毫秒。每次重复执行的时间都和第一次执行的时间有关,而不是与前一次执行的时间有关,因此执行的整个速率是固定的 |
void scheduleAtFixedRate(TimerTask TTask,Date targetTime,long repeat) | TTask被安排在由targetTime指定的时间执行,然后任务再以repeat传递的时间间隔重复执行。repeat参数的单位是毫秒。每次重复执行的时间都与第一次执行的时间有关,而不是与前一次执行的时间有关,因此执行的整个速率是固定的 |
创建完Timer对象之后,就可以对创建的Timer对象调用schedule()方法以安排任务了。正如表2中显示的,schedule()方法有多种形式,可以使用多重方式安排任务。
如果创建的是非守护任务,那么当程序结束会希望调用cancel()方法以结束任务。如果不这么做,程序可能会被挂起一段时间。
下面的程序演示了Timer和TimerTask类。该程序定义了一个定时任务,任务的run()方法将显示消息"Timer task executed."。这个任务被安排在最初延迟一秒之后执行,并且每半秒钟执行一次。
//Demonstrate Timer and TimerTask.
import java.util.TimerTask;
class MyTimerTask extends TimerTask {
@Override
public void run() {
System.out.println("Timer task executed.");
}
}
import java.util.Timer;
class TTest {
public static void main(String[] args) {
MyTimerTask myTask = new MyTimerTask();
Timer myTimer = new Timer();
/*Set an initial delay of 1 second,
then repeat every half second.
*/
myTimer.schedule(myTask,1000,500);
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
myTimer.cancel();
}
}