1. 基本概念
Timer:一个*定时器工具,用于在后台线程中计划执行指定任务。它可以安排任务执行一次,或者定期重复执行。
TimerTask:一个抽象类,它的子类代表一个可以被Timer计划执行的任务。TimerTask类实现了Runnable接口,因此每一个具体的任务类都必须继承TimerTask,并重写run()方法来定义具体的任务逻辑。
2. 核心方法
Timer类提供了几个核心方法用于安排任务的执行,主要包括:
schedule(TimerTask task, Date time):在指定的时间执行一次任务。
schedule(TimerTask task, long delay):在指定的延迟时间后执行一次任务。
schedule(TimerTask task, long delay, long period):在指定的延迟时间后开始执行任务,并按照给定的时间间隔重复执行。
scheduleAtFixedRate(TimerTask task, Date firstTime, long period):在指定的时间开始执行任务,并按照给定的时间间隔重复执行,但是不考虑任务的执行时间。
scheduleAtFixedRate(TimerTask task, long delay, long period):在指定的延迟时间后开始执行任务,并按照给定的时间间隔重复执行,但是不考虑任务的执行时间。
3. 工作原理
Timer内部包含了一个任务队列(TaskQueue)和一个任务调度线程(TimerThread)。任务队列用于存储待执行的任务,任务调度线程则负责从队列中取出任务并执行。
当调用Timer的schedule方法时,实际上是将一个TimerTask对象放入了任务队列中,并设置了该任务的执行时间。任务调度线程会不断地检查任务队列,如果发现有任务的执行时间已到,就会从队列中取出该任务并执行。
4. 注意事项
Timer是单线程的,即所有的任务都是由同一个线程来执行的。如果某个任务的执行时间过长,可能会影响其他任务的执行。
如果在执行任务时抛出了未检查的异常,那么Timer线程将会终止,后续的任务将不会被执行。因此,建议在任务中处理好可能抛出的异常。
Java 5及之后的版本中,推荐使用ScheduledExecutorService接口提供的定时任务调度功能,它支持多线程执行任务,更加灵活和可靠。
演示:
import java.util.Timer;
import java.util.TimerTask;
public class M {
public static void main(String[] args) {
Timer timer=new Timer();
TimerTask taske1=new TimerTask() {
@Override
public void run() {
System.out.println("task1");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
TimerTask taske2 =new TimerTask() {
@Override
public void run() {
System.out.println("task2");
}
};
//但由于 timer 内只有一个线程来顺序执行队列中的任务,因此『任务1』的延时,影响了『任务2』的执行
timer.schedule(taske1,1000);
timer.schedule(taske2,1000);
}
}