java定时器--TimerTask 与 Timer

时间:2022-02-22 03:41:55
如果您想要在某个时间点之后,执行某项排定的任务,您可以定义一个TimerTask,再将之排定给Timer,Timer会依指定的时间来执行TimerTask。

举个实例来说,您想在程式启动后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的排程。