這兩個(gè)類使用起來非常方便,可以完成我們對(duì)定時(shí)器的絕大多數(shù)需求
Timer類是用來執(zhí)行任務(wù)的類,它接受一個(gè)TimerTask做參數(shù)
Timer有兩種執(zhí)行任務(wù)的模式,最常用的是schedule,它可以以兩種方式執(zhí)行任務(wù):1:在某個(gè)時(shí)間(Data),2:在某個(gè)固定的時(shí)間之后(int delay).這兩種方式都可以指定任務(wù)執(zhí)行的頻率.看個(gè)簡(jiǎn)單的例子:
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秒后執(zhí)行此任務(wù),每次間隔2秒,如果傳遞一個(gè)Data參數(shù),就可以在某個(gè)固定的時(shí)間執(zhí)行這個(gè)任務(wù).
while(true)...{//這個(gè)是用來停止此任務(wù)的,否則就一直循環(huán)執(zhí)行此任務(wù)了
try ...{
int ch = System.in.read();
if(ch-‘c‘==0)...{
timer.cancel();//使用這個(gè)方法退出任務(wù)
}
} 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("________");
}
}
}
如果你使用的是JDK5+,還有一個(gè)scheduleAtFixedRate模式可以用,在這個(gè)模式下,Timer會(huì)盡量的讓任務(wù)在一個(gè)固定的頻率下運(yùn)行,舉例說明:在上面的例子中,我們想讓MyTask在1秒鐘后,每兩秒鐘執(zhí)行一次,但是因?yàn)閖ava不是實(shí)時(shí)的(其實(shí)java實(shí)時(shí)性很差.....),所以,我們?cè)谏蟼€(gè)程序中表達(dá)的原義并不能夠嚴(yán)格執(zhí)行.如果我們調(diào)用的是scheduleAtFixedRate,那么,Timer會(huì)盡量讓你的Task執(zhí)行的頻率保持在2秒一次.運(yùn)行上面的程序,假設(shè)使用的是scheduleAtFixedRate,那么下面的場(chǎng)景就是可能的:1秒鐘后,MyTask 執(zhí)行一次,因?yàn)橄到y(tǒng)繁忙,之后的2.5秒后MyTask 才得以執(zhí)行第二次,然后,Timer記下了這個(gè)延遲,并嘗試在下一個(gè)任務(wù)的時(shí)候彌補(bǔ)這個(gè)延遲,那么,1.5秒后,MyTask 將執(zhí)行的三次."以固定的頻率而不是固定的延遲時(shí)間去執(zhí)行一個(gè)任務(wù)"
果然很方便吧^_^
下面給出一個(gè)復(fù)雜點(diǎn)的例子,其中告訴大家怎么退出單個(gè)TimerTask,怎么退出所有Task
package MyTimerTest;
import java.io.IOException;
import java.util.Timer;
/**//*
* 本類給出了使用Timer和TimerTaske的主要方法,其中包括定制任務(wù),添加任務(wù)
* 退出任務(wù),退出定時(shí)器.
* 因?yàn)門imerTask的status域是包級(jí)可訪問的,所以沒有辦法在java.util.包外
* 得到其狀態(tài),這對(duì)編程造成一些不便 .我們不能判斷某個(gè)Task的狀態(tài)了.
*
*/
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");//從控制臺(tái)讀出信息
if (strInfo.charAt(strInfo.length() - 1) == ‘ ‘) ...{
strInfo = strInfo.substring(0, strInfo.length() - 2);
}
if (strInfo.startsWith("Cancel-1")) ...{
myTask1.cancel();//退出單個(gè)任務(wù)
// 其實(shí)應(yīng)該在這里判斷myTask2是否也退出了,是的話就應(yīng)該break.但是因?yàn)闊o法在包外得到
// myTask2的狀態(tài),所以,這里不能做出是否退出循環(huán)的判斷.
} else if (strInfo.startsWith("Cancel-2")) ...{
myTask2.cancel();
} else if (strInfo.startsWith("Cancel-All")) ...{
timer.cancel();//退出Timer
break;
} else ...{
// 只對(duì)myTask1作出判斷,偷個(gè)懶^_^
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;
}
}
}