Timer和TimerTask【轉(zhuǎn)載】
有時(shí)候需要每隔一段時(shí)間去執(zhí)行某個(gè)任務(wù),在Java中提供了Timer和TimerTask來(lái)完成這個(gè)任務(wù),這個(gè)兩個(gè)類(lèi)位于java.util包中。Timer類(lèi)是Java中一種線(xiàn)程設(shè)施,用于安排以后在后臺(tái)線(xiàn)程中執(zhí)行的任務(wù),可以安排任務(wù)執(zhí)行一次或定期重復(fù)執(zhí)行。與每個(gè)Timer對(duì)象對(duì)應(yīng)的是單個(gè)后臺(tái)線(xiàn)程,用于順序的執(zhí)行所有計(jì)時(shí)器任務(wù)。
對(duì)Timer對(duì)象最后的引用完成后,并且所有未處理的任務(wù)都已執(zhí)行完畢后,計(jì)時(shí)器的任務(wù)執(zhí)行線(xiàn)程會(huì)正常終止,并且成為垃圾回收的對(duì)象。但是這可能要很長(zhǎng)時(shí)間后才能發(fā)生。默認(rèn)情況下,任務(wù)執(zhí)行線(xiàn)程并不作為守護(hù)線(xiàn)程來(lái)運(yùn)行,所以它能夠阻止應(yīng)用程序終止。如果調(diào)用者想要快速終止計(jì)時(shí)器的任務(wù)執(zhí)行線(xiàn)程,那么請(qǐng)調(diào)用計(jì)時(shí)器的cancel方法。
TimerTask對(duì)象由Timer安排為一次執(zhí)行或重復(fù)執(zhí)行的任務(wù),也就是說(shuō),Timer負(fù)責(zé)計(jì)時(shí),具體的任務(wù)由TimerTask來(lái)完成。
以下用兩段程序來(lái)說(shuō)明它們的用法。
Example1:LOGO閃屏
在游戲中,當(dāng)游戲開(kāi)始之前,會(huì)顯示一些Logo圖片,在顯示Logo圖片的同時(shí),進(jìn)行資源文件的加載。這種情形可以利用Timer來(lái)進(jìn)行圖片的切換工作,先看看派生自TimerTask的具體的任務(wù)完成類(lèi)EventTimerTask類(lèi)源代碼:

import java.util.TimerTask;
class EventTimerTask extends TimerTask{
private int imageNum;
private int imageCur = 0;
private Timer timer;
public void run(){
//判斷當(dāng)前顯示的圖片序號(hào)
if(++imageCur<=imageNum){
System.out.println("當(dāng)前屏幕上顯示的是第" + imageCur + "張圖片");
}else{
timer.cancel();
System.out.println("游戲資源加載完畢,開(kāi)始進(jìn)入游戲");
}
}
public void setImageNum(int imageNum){
this.imageNum = imageNum;
}
public void setTimer(Timer timer){
this.timer = timer;
}
}
接下來(lái)是類(lèi)ReadLogo代碼:

import java.util.TimerTask;
public class ReadLogo{
private Timer timer = new Timer();
private EventTimerTask timerTask = new EventTimerTask();
private int imageNum = 10;
private int delay = 1;
private int second = 2;
public void startTimerTask(){
timerTask.setTimer(timer);
timerTask.setImageNum(imageNum);
timer.schedule(timerTask, delay*1000, second*1000);
System.out.println("加載其它游戲資源......");
}
public static void main(String[] args){
ReadLogo rl = new ReadLogo();
rl.startTimerTask();
}
}
程序運(yùn)行結(jié)果:
當(dāng)前屏幕上顯示的是第1張圖片
當(dāng)前屏幕上顯示的是第2張圖片
當(dāng)前屏幕上顯示的是第3張圖片
當(dāng)前屏幕上顯示的是第4張圖片
當(dāng)前屏幕上顯示的是第5張圖片
當(dāng)前屏幕上顯示的是第6張圖片
當(dāng)前屏幕上顯示的是第7張圖片
當(dāng)前屏幕上顯示的是第8張圖片
當(dāng)前屏幕上顯示的是第9張圖片
當(dāng)前屏幕上顯示的是第10張圖片
游戲資源加載完畢,開(kāi)始進(jìn)入游戲
Example2:煮雞蛋計(jì)時(shí)程序

import java.util.TimerTask;
public class EggTask extends TimerTask {
private Timer timer;
public EggTask(Timer timer){
this.timer = timer;
}
public void run(){
playSound();
timer.cancel();
}
private void playSound(){
System.out.println("雞蛋煮好了,播放聲音!~~~");
}
}

private final Timer timer = new Timer();
private final int minutes;
public EggTimer(int minutes){
this.minutes = minutes;
}
public void start(){
EggTask et = new EggTask(timer);
//將任務(wù)和計(jì)時(shí)器關(guān)聯(lián)在一起。第一個(gè)參數(shù)是要執(zhí)行的任務(wù)
//第二個(gè)參數(shù)是執(zhí)行任務(wù)前的延遲時(shí)間,單位是毫秒
timer.schedule(et, minutes*60*1000);
}
public static void main(String[] args){
final int minutes = 2;
System.out.println("煮雞蛋計(jì)時(shí)器開(kāi)始記時(shí),"+minutes+"分鐘后雞蛋煮熟會(huì)播放聲音!");
EggTimer eggTimer = new EggTimer(minutes);
eggTimer.start();
}
}
程序運(yùn)行結(jié)果:
雞蛋煮好了,播放聲音!~~~
posted on 2012-04-10 09:11 Rabbit 閱讀(306) 評(píng)論(0) 編輯 收藏