举个实例来说,您想在程式启动后5秒钟执行报时,则您可以继承TimerTask,并重新定义其run()方法。
- DateTask.java
package onlyfun.caterpillar;
import java.util.*;
public class DateTask extends TimerTask {
public void run() {
System.out.println("任务时间:" + new Date());
}
}
在run()方法中,只简单的显示run()方法被执行的时间,TimerTask的排程执行要交给Timer物件,例如:
- Main.java
package onlyfun.caterpillar;
import java.util.*;
public class Main {
public static void main(String[] args) {
Timer timer = new Timer();
timer.schedule(new DateTask(), 5000);
System.out.println("现在时间:" + new Date());
try {
Thread.sleep(8000);
}
catch(InterruptedException e) {
}
timer.cancel();
}
}
Timer物件的schedule()方法接受TimerTask实例,并可以给它一个毫秒数,表示schedule()方法执行后,几毫秒之后执行 TimerTask中的run()方法,Timer物件在启动排程后,如果要停止,则要执行cancel()方法,这个程式的执行结果如下:
现在时间:Fri Jan 19 10:47:10 CST 2007 任务时间:Fri Jan 19 10:47:15 CST 20 07 |
除了指定几毫秒之后执行任务之外,您还可以要求Timer物件,每隔多少时间就执行一次TimerTask的run()方法,例如一秒后开始执行TimerTask,而后每隔3秒执行一次:
- Main.java
package onlyfun.caterpillar;
import java.util.*;
public class Main {
public static void main(String[] args) {
Timer timer = new Timer();
timer.schedule(new DateTask(), 1000, 3000);
System.out.println("现在时间:" + new Date());
try {
Thread.sleep(20000);
}
catch(InterruptedException e) {
}
timer.cancel();
}
}
执行结果如下:
现在时间:Fri Jan 19 10:49:43 CST 2007 任务时间:Fri Jan 19 10:49:44 CST 2007 任务时间:Fri Jan 19 10:49:47 CST 2007 任务时间:Fri Jan 19 10:49:50 CST 2007 任务时间:Fri Jan 19 10:49:53 CST 2007 任务时间:Fri Jan 19 10:49:56 CST 2007 任务时间:Fri Jan 19 10:49:59 CST 2007 任务时间:Fri Jan 19 10:50:02 CST 2007 |
Timer的schedule()方法也可以接受Date实例,例如您想直接排定执行日为一个月之后,则可以透过Calendar来计算,再取得Date时间:
Calendar c = Calendar.getInstance();
c.add(Calendar.MONTH, 1);
System.out.println("任务排定时间:" + c.getTime());
Timer timer = new Timer();
timer.schedule(new DateTask(), c.getTime(), 3000);
Timer与TimerTask是独立的两个物件,当使用Timer的schedule()方法排定TimerTask之后,则必须等执行Timer的 cancel()执行之后,让TimerTask与Timer脱离关系,TimerTask才可以重新加入其它Timer的排程。