Timer有兩種執行任務的模式,最常用的是schedule,它可以以兩種方式執行任務:1:在某個時間(Data),2:在某個固定的時間之後(int delay).這兩種方式都可以指定任務執行的頻率.看個簡單的範例:
複製代碼代碼如下:
import java.io.IOException;
import java.util.Timer;
public class TimerTest {
public static void main(String[] args){
Timer timer = new Timer();
timer.schedule(new MyTask(), 1000, 2000);//在1秒後執行此任務,每次間隔2秒,如果傳遞一個Data參數,就可以在某個固定的時間執行這個任務.
while(true){//這個是用來停止此任務的,否則就一直循環執行此任務了
try {
int ch = System.in.read();
if(ch-'c'==0){
timer.cancel();//使用這個方法退出任務
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
static class MyTask extends java.util.TimerTask{
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("________");
}
}
}
如果你使用的是JDK 5+,還有一個scheduleAtFixedRate模式可以用,在這個模式下,Timer會盡量的讓任務在一個固定的頻率下運行,舉例說明:在上面的例子中,我們想讓MyTask在1秒鐘後,每兩秒鐘執行一次,但是因為java不是實時的(其實java實時性很差.....),所以,我們在上個程序中表達的原義並不能夠嚴格執行.如果我們調用的是scheduleAtFixedRate,那麼,Timer會盡量讓你的Task執行的頻率保持在2秒一次.運行上面的程序,假設使用的是scheduleAtFixedRate,那麼下面的場景就是可能的:1秒鐘後,MyTask執行一次,因為系統繁忙,之後的2.5秒後MyTask 才得以執行第二次,然後,Timer記下了這個延遲,並嘗試在下一個任務的時候彌補這個延遲,那麼,1.5秒後,MyTask 將執行的三次."以固定的頻率而不是固定的延遲時間去執行一個任務"
下面給一個複雜點的例子,其中告訴大家怎麼退出單一TimerTask,怎麼退出所有Task
複製代碼代碼如下:
package MyTimerTest;
import java.io.IOException;
import java.util.Timer;
/*
* 本類別給出了使用Timer和TimerTaske的主要方法,其中包括定制任務,添加任務
* 退出任務,退出定時器.
* 因為TimerTask的status域是包級可存取的,所以沒有辦法在java.util.包外
* 得到其狀態,這對程式設計造成一些不便.我們不能判斷某個Task的狀態了.
*
*/
public class TimerTest {
public static void main(String[] args) {
Timer timer = new Timer();
MyTask myTask1 = new MyTask();
MyTask myTask2 = new MyTask();
myTask2.setInfo("myTask-2");
timer.schedule(myTask1, 1000, 2000);
timer.scheduleAtFixedRate(myTask2, 2000, 3000);
while (true) {
try {
byte[] info = new byte[1024];
int len = System.in.read(info);
String strInfo = new String(info, 0, len, "GBK");//從控制台讀取訊息
if (strInfo.charAt(strInfo.length() - 1) == ' ') {
strInfo = strInfo.substring(0, strInfo.length() - 2);
}
if (strInfo.startsWith("Cancel-1")) { myTask1.cancel();//退出單一任務
// 其實應該在這裡判斷myTask2是否也退出了,是的話就應該break.但是因為無法在包外得到
// myTask2的狀態,所以,這裡不能做出是否退出循環的判斷.
} else if (strInfo.startsWith("Cancel-2")) {
myTask2.cancel();
} else if (strInfo.startsWith("Cancel-All")) {
timer.cancel();//退出Timer
break;
} else {
// 只對myTask1作出判斷,偷個懶^_^
myTask1.setInfo(strInfo);
}
} catch (IOException e) { // TODO Auto-generated catch block
e.printStackTrace();
}
}
}
static class MyTask extends java.util.TimerTask {
String info = "^_^";
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println(info);
}
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
}
}