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