有時候需要每隔一段時間去執行某個任務,在Java中提供了Timer和TimerTask來完成這個任務,這個兩個類位于java.util包中。Timer類是Java中一種線程設施,用于安排以后在后臺線程中執行的任務,可以安排任務執行一次或定期重復執行。與每個Timer對象對應的是單個后臺線程,用于順序的執行所有計時器任務。
對Timer對象最后的引用完成后,并且所有未處理的任務都已執行完畢后,計時器的任務執行線程會正常終止,并且成為垃圾回收的對象。但是這可能要很長時間后才能發生。默認情況下,任務執行線程并不作為守護線程來運行,所以它能夠阻止應用程序終止。如果調用者想要快速終止計時器的任務執行線程,那么請調用計時器的cancel方法。
TimerTask對象由Timer安排為一次執行或重復執行的任務,也就是說,Timer負責計時,具體的任務由TimerTask來完成。
以下用兩段程序來說明它們的用法。
Example1:LOGO閃屏
在游戲中,當游戲開始之前,會顯示一些Logo圖片,在顯示Logo圖片的同時,進行資源文件的加載。這種情形可以利用Timer來進行圖片的切換工作,先看看派生自TimerTask的具體的任務完成類EventTimerTask類源代碼:
代碼import java.util.Timer;
import java.util.TimerTask;
class EventTimerTask extends TimerTask{
private int imageNum;
private int imageCur = 0;
private Timer timer;
public void run(){
//判斷當前顯示的圖片序號
if(++imageCur<=imageNum){
System.out.println("當前屏幕上顯示的是第" + imageCur + "張圖片");
}else{
timer.cancel();
System.out.println("游戲資源加載完畢,開始進入游戲");
}
}
public void setImageNum(int imageNum){
this.imageNum = imageNum;
}
public void setTimer(Timer timer){
this.timer = timer;
}
}
接下來是類ReadLogo代碼:
代碼import java.util.Timer;
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();
}
}
程序運行結果:
加載其它游戲資源......
當前屏幕上顯示的是第1張圖片
當前屏幕上顯示的是第2張圖片
當前屏幕上顯示的是第3張圖片
當前屏幕上顯示的是第4張圖片
當前屏幕上顯示的是第5張圖片
當前屏幕上顯示的是第6張圖片
當前屏幕上顯示的是第7張圖片
當前屏幕上顯示的是第8張圖片
當前屏幕上顯示的是第9張圖片
當前屏幕上顯示的是第10張圖片
游戲資源加載完畢,開始進入游戲
Example2:煮雞蛋計時程序
代碼import java.util.Timer;
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("雞蛋煮好了,播放聲音!~~~");
}
}
代碼public class EggTimer {
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);
//將任務和計時器關聯在一起。第一個參數是要執行的任務
//第二個參數是執行任務前的延遲時間,單位是毫秒
timer.schedule(et, minutes*60*1000);
}
public static void main(String[] args){
final int minutes = 2;
System.out.println("煮雞蛋計時器開始記時,"+minutes+"分鐘后雞蛋煮熟會播放聲音!");
EggTimer eggTimer = new EggTimer(minutes);
eggTimer.start();
}
}
程序運行結果:
煮雞蛋計時器開始記時,2分鐘后雞蛋煮熟會播放聲音!
雞蛋煮好了,播放聲音!~~~