java定时器_拾遗Timer定时器
一 Timer 介紹
在開發中我們經常會遇到一些簡單定時任務的需求,而不需要量級較重的定時任務就可以采取java定時器;
java.util.Timer工具類中的Timer 是定時器,但定時任務寫在java.util.TimerTask 中,由 Timer 執行 TimerTask ;
Timer 的本質就是線程,構造方法如下
public從源碼角度可知,如果這樣創建定時器非守護線程,即使主線程運行結束,定時任務還是會執行;如果我們會使用如下的構造方式創建定時任務就是守護線程方式,會隨著主線程的消亡而消亡;
publicTimer內部維護了一個優先隊列,用于順序執行TimerTask任務;
private優先隊列的實現就是數組方式作為平衡二叉堆
privateTimerTask 實現了Runnable 接口,執行的任務動作就是run方法;
public所以定時器的本質就是啟動了一個新的線程執行任務,這些任務都會維護在優先隊列里面;
timer的調度主要方法如下
- schedule(TimerTask task, long delay) 延遲 delay 毫秒執行一次
- schedule(TimerTask task, Date time) 指定時間執行一次
- schedule(TimerTask task, long delay, long period) 延遲delay毫秒以后,每隔period毫秒執行一次
- schedule(TimerTask task, Date firstTime, long period) 從firstTime時刻開始,每隔period毫秒執行一次
二 Timer使用示例
如果方式簡單使用Timer去延遲執行線程任務,當然其它四種方法同理,調用方式區別不大;
public輸出的間隔大約就是5秒
程序執行時間 18:47:28.258 線程執行了18:47:33.259三 cancel 方法
TimerTask的cancel () 方法是將自身任務從任務隊列中移除
我們先延遲2秒,再每2秒執行一次看效果
public結果是每2秒會執行一次
程序執行時間18:59:23.557 線程執行了18:59:25.558 線程執行了18:59:27.558 線程執行了18:59:29.559啟用cancel方法,后 就只會執行一次
public輸出如下
程序執行時間19:02:12.770 線程執行了19:02:14.772Timer的cancel方法是移除所有的任務;
public輸出直接報錯
程序執行時間:19:34.294 Exception in thread "main" java.lang.IllegalStateException: Timer already cancelled.at java.util.Timer.sched(Timer.java:397)at java.util.Timer.schedule(Timer.java:248)at com.youku1327.base.timer.TimerAbsolute.main(TimerAbsolute.java:28)四 scheduleAtFixedRate
schedule 與 scheduleAtFixedRate 方法的區別如下:
schedule 方法如果執行任務的時間沒有被延遲,下一次執行任務時間參考的是上一次任務執行的開始時間
scheduleAtFixedRate 方法如果執行任務的時間沒有被延遲,下一次執行任務時間參考的是上一次任務執行的結束時間
五 Timer缺點
- Timer 對調度的支持是基于絕對時間的,而不是相對時間,所以它對系統時間的改變非常敏感。
- Timer 線程是不會捕獲異常的,如果 TimerTask 拋出的了未檢查異常則會導致 Timer 線程終止。
總結
以上是生活随笔為你收集整理的java定时器_拾遗Timer定时器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: caffe源码阅读(1)_整体框架和简介
- 下一篇: Shell 自定义函数