使用过程:
1.通过继承 TimerTask 类 并实现 run() 方法来自定义要执行的任务
2.通过执行Timer.schedule() 执行任务
public class TimerTest1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
SimpleDateFormat simpleDateFormat =new SimpleDateFormat("HH:mm:ss");
TimerTask task = new TimerTask() {
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println(simpleDateFormat.format(new Date()) );//打印当前时间
}
};
// 通过执行Timer.schedule(TimerTask task,Date time) 在执行时间运行任务
Timer timer = new Timer();
timer.schedule(task, new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2020-07-16 12:00:00")); //2020-07-16 12:00:00执行
timer.schedule(task, 3000); //当前时间3秒后执行task任务
timer.schedule(task, 5000,1000); //当前时间3秒后执行task任务,并且间隔1秒执行一次
}
}
Timer的构造方法如下:
- Timer() 创建一个新计时器。
- Timer(boolean isDaemon)创建一个新计时器,可以指定其相关的线程作为守护程序运行。
- Timer(String name)创建一个新计时器,其相关的线程具有指定的名称。
- Timer(String name, boolean isDaemon)创建一个新计时器,其相关的线程具有指定的名称,并且可以指定作为守护程序运行。
Schedule重载方法如下:
- void schedule(TimerTask task, Date time)安排在指定的时间执行指定的任务。
- void schedule(TimerTask task, Date firstTime, long period)安排指定的任务在指定的时间开始进行重复的固定延迟执行。
- void schedule(TimerTask task, long delay)安排在指定延迟后执行指定的任务。
- void schedule(TimerTask task, long delay, long period)安排指定的任务从指定的延迟后开始进行重复的固定延迟执行。
- void scheduleAtFixedRate(TimerTask task,Date time, long period)安排指定的任务从指定时间后开始进行重复的固定延迟执行。如果该任务因为某些原因(例如垃圾收集)而延迟执行,那么接下来的任务会尽可能的快速执行,以赶上特定的时间点 。
- void scheduleAtFixedRate(TimerTask task, long delay, long period)安排指定的任务从指定的延迟后开始进行重复的固定延迟执行。如果该任务因为某些原因(例如垃圾收集)而延迟执行,那么接下来的任务会尽可能的快速执行,以赶上特定的时间点 。
注意:
TimerTask 是以队列的方式一个一个被顺序运行的,对任务的调度是基于绝对时间的,所有的TimerTask只有一个线程TimerThread来执行,因此同一时刻只有一个TimerTask在执行,任何一个TimerTask的执行异常都会导致Timer终止所有任务。
所以执行的时间和你预期的时间可能不一致,因为前面的任务可能消耗的时间较长,则后面的任务运行的时间会被延迟。
因此如果需要同时执行多个任务,可以借助ScheduledExecutorService的方式。可参考 定时器(三)------ScheduledExecutorService