在接口開發時,有一種開發模式叫定時器模式,可以理解為每經過一段預設的時間就會執行一次事件,而在我們的工作中,這個事件所實現的功能一般是將兩個系統的數據信息進行同步,這樣就實現了兩個系統通過接口進行對接的功能。
下面對於JAVA如何實現定時器功能進行簡單的解釋
JAVA中有專門可以實現此功能的類:Timer類和TimerTask類
Timer是一種定時器工具,用來在一個后台線程計划執行指定任務,而TimerTask是一個抽象類,它的子類代表一個可以被Timer計划的任務。
Timer類
在工具類Timer中,提供了四個構造方法,每個構造方法都啟動了計時器線程,同時Timer類可以保證多個線程可以共享單個Timer對象而無需進行外部同步,所以Timer類是線程安全的。但是由於每一個Timer對象對應的是單個后台線程,用於順序執行所有的計時器任務,一般情況下我們的線程任務執行所消耗的時間應該非常短,但是由於特殊情況導致某個定時器任務執行的時間太長,那么他就會“獨占”計時器的任務執行線程,其后的所有線程都必須等待它執行完,這就會延遲后續任務的執行,使這些任務堆積在一起,具體情況我們后面分析。
當程序初始化完成Timer后,定時任務就會按照我們設定的時間去執行,Timer提供了schedule方法如下:
schedule(TimerTask task, Date time):安排在指定的時間執行指定的任務。
schedule(TimerTask task, Date firstTime, long period) :安排指定的任務在指定的時間開始進行重復的固定延遲執行。
schedule(TimerTask task, long delay) :安排在指定延遲后執行指定的任務。
schedule(TimerTask task, long delay, long period) :安排指定的任務從指定的延遲后開始進行重復的固定延遲執行。
同時也重載了scheduleAtFixedRate方法,scheduleAtFixedRate方法與schedule相同,只不過他們的側重點不同,區別后面分析。
scheduleAtFixedRate(TimerTask task, Date firstTime, long period):安排指定的任務在指定的時間開始進行重復的固定速率執行。
scheduleAtFixedRate(TimerTask task, long delay, long period):安排指定的任務在指定的延遲后開始進行重復的固定速率執行。
TimerTask
TimerTask類是一個抽象類,由Timer 安排為一次執行或重復執行的任務。它有一個抽象方法run()方法,該方法用於執行相應計時器任務要執行的操作。因此每一個具體的任務類都必須繼承TimerTask,然后重寫run()方法。
另外它還有兩個非抽象的方法:
boolean cancel():取消此計時器任務。
long scheduledExecutionTime():返回此任務最近實際執行的安排執行時間。
Timer的缺陷
Timer計時器可以定時(指定時間執行任務)、延遲(延遲5秒執行任務)、周期性地執行任務(每隔個1秒執行任務),但是,Timer存在一些缺陷。首先Timer對調度的支持是基於絕對時間的,而不是相對時間,所以它對系統時間的改變非常敏感。其次Timer線程是不會捕獲異常的,如果TimerTask拋出的了未檢查異常則會導致Timer線程終止,同時Timer也不會重新恢復線程的執行,他會錯誤的認為整個Timer線程都會取消。同時,已經被安排單尚未執行的TimerTask也不會再執行了,新的任務也不能被調度。故如果TimerTask拋出未檢查的異常,Timer將會產生無法預料的行為。
解決方法可以參考:http://blog.csdn.net/lmj623565791/article/details/27109467