Java世界

          學(xué)習(xí)筆記

          常用鏈接

          統(tǒng)計(jì)

          積分與排名

          天籟村

          新華網(wǎng)

          雅虎

          最新評(píng)論

          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.Timer;
          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.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();   
              }   
          }
           

           

           

          程序運(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.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);
                  
          //將任務(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é)果:

          煮雞蛋計(jì)時(shí)器開(kāi)始記時(shí),2分鐘后雞蛋煮熟會(huì)播放聲音!
          雞蛋煮好了,播放聲音!
          ~~~

          posted on 2012-04-10 09:11 Rabbit 閱讀(306) 評(píng)論(0)  編輯  收藏


          只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 手游| 蒙阴县| 海丰县| 滨州市| 通山县| 哈尔滨市| 阿拉善左旗| 临颍县| 高碑店市| 平顶山市| 循化| 大方县| 新平| 寿光市| 鱼台县| 色达县| 金沙县| 夹江县| 崇左市| 阿城市| 都匀市| 东明县| 西青区| 拉萨市| 岳西县| 漾濞| 东兴市| 突泉县| 文化| 石台县| 杭锦后旗| 平凉市| 平邑县| 丹凤县| 长兴县| 桑植县| 云浮市| 贵德县| 莱西市| 浠水县| 永城市|