首頁 > Java > java教程 > 主體

如何使用Java定時器Timer

小云云
發布: 2017-12-06 09:04:25
原創
2982 人瀏覽過

timer 功能在指定的時間間隔內重複觸發指定視窗的計時器事件。語法Timer ( interval {, windowname } )參數interval:指定兩次觸發Timer事件之間的時間間隔,有效值在0到65之間。本文文主要為大家詳細介紹了Java定時器Timer的使用方法,具有一定的參考價值,有興趣的小夥伴們可以參考一下。

定時規劃任務功能在Java中主要使用的是Timer對象,它在內部使用多執行緒的方式進行處理,所以它和多執行緒技術還是有非常大的關聯的。在JDK中Timer類別主要負責規劃任務的功能,也就是在指定的時間開始執行某一個任務,但封裝任務的類別卻是TimerTask類別。

      透過繼承TimerTask 類別並實作run() 方法來自訂要執行的任務:

public class Mytask extends TimerTask {
  @Override
  public void run()
  {
    DateFormat dateFormat = TimeUtil.df.get();
    System.out.println("我的任务运行了" + dateFormat.format(new Date()));
  }
}
登入後複製

##      執行Timer.schedule(TimerTask task,Date time) 在執行時間執行任務:

#

public class Run {
  private static Timer timer=new Timer();

  public static void main(String[] args) throws ParseException
  {
    timer.schedule(new Mytask(), TimeUtil.df.get().parse("2017-09-14 09:19:30"));
  }
}
登入後複製

備註:時間轉換工具類,確保執行緒安全:

public class TimeUtil
{
  public static final ThreadLocal<DateFormat> df = new ThreadLocal<DateFormat>() {
    @Override
    protected DateFormat initialValue() {
      return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    }
  };
}
登入後複製

二、Timer類別注意事項

1、建立一個Timer 物件就是新啟動了一個線程,但是這個新啟動的線程,並不是守護線程,它一直在後台運行,透過如下可以將新啟動的Timer 線程設定為守護線程。

private static Timer timer=new Timer(true);
登入後複製

 2、提前:當計畫時間早於目前時間,則任務立即運作。

 3、延遲:TimerTask 是以佇列的方式一個一個被順序運行的,所以執行的時間和你預期的時間可能不一致,因為前面的任務可能消耗的時間較長,則後面的任務運轉的時間會被延遲。延遲的任務具體開始的時間,就是依據前面任務的"結束時間"

# 4、週期性運行:Timer.schedule(TimerTask task,Date firstTime,long period ) 從firstTime 開始每隔period 毫秒執行一次任務:

#5、schedule(TimerTask task,long delay) 目前的時間為參考時間,在此時間基礎上延遲制定的毫秒數後執行一次TimerTask任務。

6、schedule(TimerTask task,long delay,long period) 目前的時間為參考時間,在此基礎上延遲制定的毫秒數,再以某一間隔時間無限次數地執行某一任務。


7、Timer的cancel() 和 TimerTask的cancel() 的差別?

前面提到任務的執行是以對列的方式一個個被順序執行的,TimerTask.cancel() 指的是 將目前任務從任務對列裡取消。 Timer.cancel() 值的是取消目前任務佇列裡的所有任務。

值得注意的是,Timer 的cancel()有時不一定會停止執行排程任務,而是正常執行。這是因為Timer類別中的cancel()方法有時並沒有爭搶到queue鎖,所以TimerTask類別中的任務繼續正常執行。

三、scheduleAtFixedRate(TimerTask task,Date firstTime,long period) 和schedule(TimerTask task,Date firstTime,long period) 區別


########################## ######相同點:######1、方法schedule 和方法scheduleAtFixedRate 都會依序執行,所以不用考慮非執行緒安全的情況。 ######2、方法schedule 和方法 scheduleAtFixedRate 如果執行任務的時間沒有被延遲,那麼下一次任務的執行時間參考的是上一次的任務的"開始"時的時間來計算的。 ######3、方法schedule 和方法 scheduleAtFixedRate 如果執行任務的時間被延遲了,那麼下一次任務的執行時間參考的是上一次任務"結束"時的時間來計算。 ###########################不同點:#########      方法schedule 與方法scheduleAtFixedRate 使用上基本上沒什麼差異,就是scheduleAtFixedRate 具有追趕執行性,什麼意思呢?就是如果任務 在週期性運行過程中被打斷了,scheduleAtFixedRate 會嘗試把之前落下的任務補上運行。而schedule就不管了,接著運行接下來的任務就行了,可以參考這篇博客,寫的很生動。 ######以上內容就是如何使用Java定時器Timer的方法,希望能幫助大家。 ######相關推薦:#########C# 定時器Timer的實例介紹#########

詳解C#中Timer的使用與解決重入問題

Java 定時器(Timer,TimerTask)詳解及實例程式碼

#

以上是如何使用Java定時器Timer的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板