研究了Quartz企業(yè)級定時器后,感覺功能太強大了,如果要執(zhí)行一些簡單的定時器任務(wù),無須做復(fù)雜的控制,也無須保存狀態(tài),那么可以考慮使用JDK 入門級的定期器Timer來執(zhí)行重復(fù)任務(wù)。
一、原理
JDK中,定時器任務(wù)的執(zhí)行需要兩個基本的類:
java.util.Timer;
java.util.TimerTask;
要運行一個定時任務(wù),最基本的步驟如下:
1、建立一個要執(zhí)行的任務(wù)TimerTask。
2、創(chuàng)建一個Timer實例,通過Timer提供的schedule()方法,將TimerTask加入到定時器Timer中,同時設(shè)置執(zhí)行的規(guī)則即可。
當(dāng)程序執(zhí)行了Timer初始化代碼后,Timer定時任務(wù)就會按照設(shè)置去執(zhí)行。
Timer中的schedule()方法是有多種重載格式的,以適應(yīng)不同的情況。該方法的格式如下:
void schedule(TimerTask task, Date time)
安排在指定的時間執(zhí)行指定的任務(wù)。
void schedule(TimerTask task, Date firstTime, long period)
安排指定的任務(wù)在指定的時間開始進(jìn)行重復(fù)的固定延遲執(zhí)行。
void schedule(TimerTask task, long delay)
安排在指定延遲后執(zhí)行指定的任務(wù)。
void schedule(TimerTask task, long delay, long period)
安排指定的任務(wù)從指定的延遲后開始進(jìn)行重復(fù)的固定延遲執(zhí)行。
Timer是線程安全的,此類可擴(kuò)展到大量同時安排的任務(wù)(存在數(shù)千個都沒有問題)。其所有構(gòu)造方法都啟動計時器線程??梢哉{(diào)用cancel() 終止此計時器,丟棄所有當(dāng)前已安排的任務(wù)。purge()從此計時器的任務(wù)隊列中移除所有已取消的任務(wù)。此類不提供實時保證:它使用 Object.wait(long) 方法來安排任務(wù)。
TimerTask是一個抽象類,由 Timer 安排為一次執(zhí)行或重復(fù)執(zhí)行的任務(wù)。它有一個抽象方法run()----計時器任務(wù)要執(zhí)行的操作。因此,每個具體的任務(wù)類都必須繼承TimerTask類,并且重寫run()方法。另外它還有兩個非抽象的方法:
boolean cancel()
取消此計時器任務(wù)。
long scheduledExecutionTime()
返回此任務(wù)最近實際 執(zhí)行的安排 執(zhí)行時間。
二、例子
下面用Timer實現(xiàn)一個簡單例子:
package stu.timer;
import java.util.Date;
import java.util.TimerTask;
/**
* 重復(fù)執(zhí)行的任務(wù)
*
* @author leizhimin,2008-10-9 9:20:20
*/
public class TestTimerTask extends TimerTask {
/**
* 此計時器任務(wù)要執(zhí)行的操作。
*/
public void run() {
Date executeTime = new Date(this.scheduledExecutionTime());
System.out.println("本次任務(wù)執(zhí)行的時間是" + executeTime);
}
}
package stu.timer;
import java.util.Timer;
import java.util.TimerTask;
/**
* 測試JDK Timer的執(zhí)行
*
* @author leizhimin,2008-10-9 9:24:35
*/
public class TestTimer {
public static void main(String[] args) {
Timer timer = new Timer();
TimerTask task = new TestTimerTask();
timer.schedule(task, 500L, 1000L);
}
}
運行結(jié)果:
本次任務(wù)執(zhí)行的時間是Thu Oct 09 09:47:57 CST 2008
本次任務(wù)執(zhí)行的時間是Thu Oct 09 09:47:58 CST 2008
本次任務(wù)執(zhí)行的時間是Thu Oct 09 09:47:59 CST 2008
本次任務(wù)執(zhí)行的時間是Thu Oct 09 09:48:00 CST 2008
本次任務(wù)執(zhí)行的時間是Thu Oct 09 09:48:01 CST 2008
本次任務(wù)執(zhí)行的時間是Thu Oct 09 09:48:02 CST 2008
本次任務(wù)執(zhí)行的時間是Thu Oct 09 09:48:03 CST 2008
本次任務(wù)執(zhí)行的時間是Thu Oct 09 09:48:04 CST 2008
本次任務(wù)執(zhí)行的時間是Thu Oct 09 09:48:05 CST 2008
......