5.1 定时器Timer的使用
Timer类主要负责计划任务的功能,也就是在指定的时间开始执行某一个任务。
Timer类主要作用是设置计划任务,但封装任务的类为TimeTask类,TimeTask类为抽象类,需自己编写类继承它,并实现其run方法。
timer类的主要方法:
1)schedule(TimeTask task,Date time):执行的日期执行一次某一任务
如果执行任务的时间晚于当前时间,则任务按照执行任务时间执行,如果执行任务时间早于当前时间,则按当前时间执行。
package p5;
import java.util.Date;
import java.util.TimerTask;
public class MyTask1 extends TimerTask{
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("任务执行时间为:"+new Date());
}
}
package p5;
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
public class Test1 {
public static void main(String[] args) {
System.out.println("当前时间为:"+new Date());
Calendar calendar=Calendar.getInstance();
calendar.add(Calendar.SECOND, 10);
Date runDate=calendar.getTime();
MyTask1 myTask1=new MyTask1();
Timer timer=new Timer();
timer.schedule(myTask1, runDate);
}
}
Timer中允许有多个TimerTask任务,TimerTask是以队列的方式一个一个地被顺序地执行,所以执行的时间可能和预期时间不一致,因为前面的任务有可能消耗的时间较长,则后面的任务的运行时间也被延长。
假设有两个任务,任务一规定在18:10执行,任务二规定在18:15执行,然而任务一执行时间为10s,即18:20才执行完毕,此时任务二只能被迫延迟到18:20开始执行。
2)schedule(TimeTask task,Date firstTime,long period):在指定的日期后按指定的间隔周期,无线循环地执行某一任务。
如: timer.schedule(task,runDate,4000);
3)TimerTask类的cancel()方法:将自身从任务队列中进行清除,其他任务不受影响。
Timer类的cancel()方法:将任务队列中全部的任务清空,并且销毁进程。
注:Timer类中的cancel()方法有时并不一定会停止计划任务,而是正常执行。因为Timer类中的cancel()方法有时并没有争抢到queue锁,则让TimeTask类中的任务正常执行。
4)schedule(TimeTask task,long delay):当前的时间为参考时间,在此时间基础上延迟指定的毫秒数后执行一次TimeTask任务
5)schedule(TimeTask task,long delay,long period):当前时间为参考时间,在此时间基础上延迟指定的毫秒数,再以某一间隔时间无限次数地执行某一任务。