Timer 定時器相關類

Timer相關類

定時執行相關類,包括java.util.Timer,以及TimerTask、還有內部類TaskQueue、TimerThread等java

###java.util.TimerTaskapi

Timer執行的調度單元。數組

#####經常使用的屬性多線程

  1. nextExecutionTime
    Task下一次執行時間oop

  2. period
    執行間隔時間。有負值、正值、0三種。0表示這個Task只執行一次、負值表示,計算下次執行時間時,用當前任務執行的當前時間+間隔時候計算。正值表示,第一次時,用起始時間+間隔時間獲得下次執行時間,而後嚴格用執行時間+間隔時間,因此爲負值的時候爲「補償」當前時間到初始時間以前全部的過期任務。線程

三、state以及常量VIRGINSCHEDULEDEXECUTEDCANCELLED
Task的狀態。調試

###java.util.Timercode

Timer調度執行類排序

TaskQueue 任務隊列內部類
  1. 內部維護一個TimerTask數組,起始大小爲128,而後以2倍擴大。
  2. 數組是一個二叉樹結構的最小堆,每上層大小都比下層要小。並向外提供了一系列操做數據方法,同時存取任務方法中都有維護最小堆。插入隊尾和彈出隊首方法後,分別用fixUpfixdown重排序。還有一個heapify重排序方法。
TimerThread 調度器線程內部類
  1. newTasksMayBeScheduled
    boolean字段,受queue監視器保護,代表Timer是否還有活的引用。繼承

  2. queue
    全部執行任務,爲TaskQueue實例。

  3. mainLoop
    循環執行全部任務。其中有關於period三種狀況的不一樣處理方法。

經常使用屬性
  1. queue
    任務隊列,是一個最小堆隊列。

  2. thread
    執行任務線程,TimerThread實例類。

  3. nextSerialNumber
    定時器序列號生成器

經常使用方法
  1. schedulescheduleAtFixedRate重載方法
    二者調用sched私有方法,根據傳入的參數的不一樣,決定period的值。由period的值決定Task的規則類型。

Timer內部邏輯

計時器主要用的類有兩個,一個是調度執行器Timer,一個是任務類TimerTask。

TimerTask繼承了Runnable接口,是一個多線程類,根據period值分爲:

  1. 0,一次執行;
  2. 負值,按當前執行時間+間隔時間執生成下次執行時間。
  3. 正值,按上次執行時間+間隔時間生成下次執行時間。該方式會補償執行從初始時間到當前時間內,有多少個間隔次數沒有執行。

Timer類中,有兩個內部類,一個是任務隊列類。內部維護一個最小堆。一個是調度線程類TimerThread,無限循環執行任務隊列中的任務。

Timer主類中,持有一個任務隊列與調試線程類。主要有一系列重載的調試方法,除了以前的執行間隔機制的不一樣,還有初始時間的不一樣,根據傳入的類型,能夠是一個指定時間點(Date),也能夠是當前時間日後延遲指定時間段(Long)。

相關文章
相關標籤/搜索