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類別注意事項
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) 目前的時間為參考時間,在此基礎上延遲制定的毫秒數,再以某一間隔時間無限次數地執行某一任務。
值得注意的是,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的實例介紹#########
Java 定時器(Timer,TimerTask)詳解及實例程式碼
#以上是如何使用Java定時器Timer的詳細內容。更多資訊請關注PHP中文網其他相關文章!