<dfn id="w48us"></dfn><ul id="w48us"></ul>
  • <ul id="w48us"></ul>
  • <del id="w48us"></del>
    <ul id="w48us"></ul>
  • Timer和TimerTask

    時間:2024-07-02 17:29:37 J2EE培訓 我要投稿
    • 相關推薦

    關于Timer和TimerTask

      Timer 功能在指定的時間間隔內反復觸發指定窗口的定時器事件。下面yjbys小編為大家準備了關于Timer和TimerTask的文章,歡迎閱讀。

      1.概覽

      Timer是一種定時器工具,用來在一個后臺線程計劃執行指定任務。它可以計劃執行一個任務一次或反復多次。

      TimerTask一個抽象類,它的子類代表一個可以被Timer計劃的任務。

      簡單的一個例程:

      import java.util.Timer;

      import java.util.TimerTask;

      /**

      * Simple demo that uses java.util.Timer to schedule a task to execute

      * once 5 seconds have passed.

      */

      public class Reminder {

      Timer timer;

      public Reminder(int seconds) {

      timer = new Timer();

      timer.schedule(new RemindTask(), seconds*1000);

      }

      class RemindTask extends TimerTask {

      public void run() {

      System.out.println("Time's up!");

      timer.cancel(); //Terminate the timer thread

      }

      }

      public static void main(String args[]) {

      System.out.println("About to schedule task.");

      new Reminder(5);

      System.out.println("Task scheduled.");

      }

      }

      運行這個小例子,你會首先看到:

      About to schedule task.

      5秒鐘之后你會看到:

      Time's up!

      這個小例子可以說明一些用Timer線程實現和計劃執行一個任務的基礎步驟:

      實現自定義的TimerTask的子類,run方法包含要執行的任務代碼,在這個例子里,這個子類就是RemindTask。

      實例化Timer類,創建計時器后臺線程。

      實例化任務對象 (new RemindTask()).

      制定執行計劃。這里用schedule方法,第一個參數是TimerTask對象,第二個參數表示開始執行前的延時時間(單位是milliseconds,這里定義了5000)。還有一種方法可以指定任務的執行時間,如下例,指定任務在11:01 p.m.執行:

      //Get the Date corresponding to 11:01:00 pm today.

      Calendar calendar = Calendar.getInstance();

      calendar.set(Calendar.HOUR_OF_DAY, 23);

      calendar.set(Calendar.MINUTE, 1);

      calendar.set(Calendar.SECOND, 0);

      Date time = calendar.getTime();

      timer = new Timer();

      timer.schedule(new RemindTask(), time);

      2.終止Timer線程

      默認情況下,只要一個程序的timer線程在運行,那么這個程序就會保持運行。當然,你可以通過以下四種方法終止一個timer線程:

      調用timer的cancle方法。你可以從程序的任何地方調用此方法,甚至在一個timer task的run方法里。

      讓timer線程成為一個daemon線程(可以在創建timer時使用new Timer(true)達到這個目地),這樣當程序只有daemon線程的時候,它就會自動終止運行。

      當timer相關的所有task執行完畢以后,刪除所有此timer對象的引用(置成null),這樣timer線程也會終止。

      調用System.exit方法,使整個程序(所有線程)終止。

      Reminder的例子使用了第一種方式。在這里不能使用第二種方式,因為這里需要程序保持運行直到timer的任務執行完成,如果設成daemon,那么當main線程結束的時候,程序只剩下timer這個daemon線程,于是程序不會等timer線程執行task就終止了。

      有些時候,程序的終止與否并不只與timer線程有關。舉個例子,如果我們使用AWT來beep,那么AWT會自動創建一個非daemon線程來保持程序的運行。

      import java.util.Timer;

      import java.util.TimerTask;

      import java.awt.Toolkit;

      /**

      * Simple demo that uses java.util.Timer to schedule a task to execute

      * once 5 seconds have passed.

      */

      public class ReminderBeep {

      Toolkit toolkit;

      Timer timer;

      public ReminderBeep(int seconds) {

      toolkit = Toolkit.getDefaultToolkit();

      timer = new Timer();

      timer.schedule(new RemindTask(), seconds*1000);

      }

      class RemindTask extends TimerTask {

      public void run() {

      System.out.println("Time's up!");

      toolkit.beep();

      //timer.cancel(); //Not necessary because we call System.exit

      System.exit(0); //Stops the AWT thread (and everything else)

      }

      }

      public static void main(String args[]) {

      System.out.println("About to schedule task.");

      new ReminderBeep(5);

      System.out.println("Task scheduled.");

      }

      }

      3.反復執行一個任務

      先看一個例子:

      public class AnnoyingBeep {

      Toolkit toolkit;

      Timer timer;

      public AnnoyingBeep() {

      toolkit = Toolkit.getDefaultToolkit();

      timer = new Timer();

      timer.schedule(new RemindTask(),

      0, //initial delay

      1*1000); //subsequent rate

      }

      class RemindTask extends TimerTask {

      int numWarningBeeps = 3;

      public void run() {

      if (numWarningBeeps > 0) {

      toolkit.beep();

      System.out.println("Beep!");

      numWarningBeeps--;

      } else {

      toolkit.beep();

      System.out.println("Time's up!");

      //timer.cancel(); //Not necessary because we call System.exit

      System.exit(0); //Stops the AWT thread (and everything else)

      }

      }

      }

      ...

      }

      執行,你會看到如下輸出:

      Task scheduled.

      Beep!

      Beep! //one second after the first beep

      Beep! //one second after the second beep

      Time's up! //one second after the third beep

      這里使用了三個參數的schedule方法用來指定task每隔一秒執行一次。如下所列為所有Timer類用來制定計劃反復執行task的方法 :

      schedule(TimerTask task, long delay, long period)

      schedule(TimerTask task, Date time, long period)

      scheduleAtFixedRate(TimerTask task, long delay, long period)

      scheduleAtFixedRate(TimerTask task, Date firstTime, long period)

      當計劃反復執行的任務時,如果你注重任務執行的平滑度,那么請使用schedule方法,如果你在乎的是任務的執行頻度那么使用scheduleAtFixedRate方法。 例如,這里使用了schedule方法,這就意味著所有beep之間的時間間隔至少為1秒,也就是說,如果有一個beap因為某種原因遲到了(未按計劃執行),那么余下的所有beep都要延時執行。如果我們想讓這個程序正好在3秒以后終止,無論哪一個beep因為什么原因被延時,那么我們需要使用scheduleAtFixedRate方法,這樣當第一個beep遲到時,那么后面的beep就會以最快的速度緊密執行(最大限度的壓縮間隔時間)。

      4.進一步分析schedule和scheduleAtFixedRate

      (1)2個參數的schedule在制定任務計劃時, 如果指定的計劃執行時間scheduledExecutionTime<=systemCurrentTime,則task會被立即執行。scheduledExecutionTime不會因為某一個task的過度執行而改變。

      (2)3個參數的schedule在制定反復執行一個task的計劃時,每一次執行這個task的計劃執行時間隨著前一次的實際執行時間而變,也就是scheduledExecutionTime(第n+1次)=realExecutionTime(第n次)+periodTime。也就是說如果第n次執行task時,由于某種原因這次執行時間過長,執行完后的systemCurrentTime>=scheduledExecutionTime(第n+1次),則此時不做時隔等待,立即執行第n+1次task,而接下來的第n+2次task的scheduledExecutionTime(第n+2次)就隨著變成了realExecutionTime(第n+1次)+periodTime。說白了,這個方法更注重保持間隔時間的穩定。

      (3)3個參數的scheduleAtFixedRate在制定反復執行一個task的計劃時,每一次執行這個task的計劃執行時間在最初就被定下來了,也就是scheduledExecutionTime(第n次)=firstExecuteTime+n*periodTime;如果第n次執行task時,由于某種原因這次執行時間過長,執行完后的systemCurrentTime>=scheduledExecutionTime(第n+1次),則此時不做period間隔等待,立即執行第n+1次task,而接下來的第n+2次的task的scheduledExecutionTime(第n+2次)依然還是firstExecuteTime+(n+2)*periodTime這在第一次執行task就定下來了。說白了,這個方法更注重保持執行頻率的穩定。

      5.一些注意的問題

      每一個Timer僅對應唯一一個線程。

      Timer不保證任務執行的十分精確。

      Timer類的線程安全的。

    【Timer和TimerTask】相關文章:

    關于TimerTask與Timer類的應用09-04

    一個JavaScript的timer的代碼10-22

    寒暄和交談06-28

    PHP中MySQL、MySQLi和PDO的用法和區別07-01

    考研英語(一)和英語(二)的題型和分值10-06

    《將相和》文言文原文和譯文09-25

    華為認證:HCIE和CCIE證書的未來和價值05-25

    華為認證:CCIE和HCIE認證形式和內容區別08-06

    比較級和最高級的用法和構成08-19

    紅茶和綠茶的區別04-27

    主站蜘蛛池模板: 精品一久久香蕉国产线看播放 | 久久91精品综合国产首页| 精品国产AⅤ一区二区三区4区| 亚洲精品第一国产综合境外资源| 国产精品一区二区久久精品| 狼色精品人妻在线视频| 精品999在线| 99精品久久久久中文字幕| 国产精品小视频免费无限app| 国产午夜精品久久久久免费视| 欧美激情精品久久久久久| AAA级久久久精品无码区| 一级A毛片免费观看久久精品| 最新国产在线精品观看| 九九热精品在线| 香蕉依依精品视频在线播放 | 亚洲精品无码久久久久AV麻豆| 亚洲日韩国产精品第一页一区| 国内精品久久久久久久久| 亚洲国产精品无码久久九九| 精品国产福利第一区二区三区| 亚洲欧美日韩精品久久亚洲区 | 国产精品电影网| 亚洲国产精品人人做人人爽| 四虎永久在线精品884aa下载| 亚洲αv在线精品糸列| 四虎影视国产精品永久在线| 欧美精品色婷婷五月综合| 久久精品www| 欧美午夜精品久久久久免费视| 国产一级精品高清一级毛片| 51午夜精品免费视频| 亚洲韩精品欧美一区二区三区| 亚洲国产成人久久精品动漫| 精品无码一区二区三区爱欲 | 在线欧美v日韩v国产精品v| 国产精品日韩欧美一区二区三区 | 亚洲精品国产成人99久久| 午夜成人精品福利网站在线观看| 亚洲国产精品久久66| 国产精品久久影院|