由于項目開發的需要,必須實現讓一個Java程
序定時運行。比如,我的項目中,有一個網絡蜘蛛,需要從互聯網上抓取數據,與其配合,有另一個程序來對新抓取的頁面進行索引的創建,由于數據源更新頻率不
高,我們不可能讓蜘蛛無休無止地工作,或者忙等待新數據的產生,那樣只能造成浪費,而且非常地不禮貌,所以最理想的情況是,讓它每隔一個小時運行一次,這
樣一天也就運行不了幾次。
那么如何才能實現讓一個Java程序定時運行呢?Java基本類庫里面,提供了兩個工具供我們使用,它們是java.util.Timer和java.util.TimerTask。
Timer是一個對象,這個對象在初始化之初,會創建一個后臺進程(TimerThread),同時創建一個任務隊列(TaskQueue),然后
后臺進程開始檢測TaskQueue中是否存在等待調度的任務,如果存在,就運行之,如果不存在,就等待(Object.wait())。
對于程序員可見的類是Timer和TimerTask,TimerTask是一個抽象類,是能夠被Timer所調度的一種對象,所有希望定時執行的任務,只要實現TimerTask類即可,然后使用Timer的schedule方法,給定一定的參數,即可實現定時執行,或者周期執行。
schedule方法的本質,是將一個TimerTask對象添加到了TaskQueue中,這個TaskQueue是一個堆(可以動態增長),可以管理很多的Task。
Timer的本質,就是一個線程,按照指定的時間順序,來順次執行一個又一個的任務,根據這種性質,我們可以知道,Timer實現的定時不可能準
確,而且,還會收到任務本身耗費時間的干擾。如果前一個任務執行時間過長,超過后一個任務的啟動時間,則后一個任務的啟動時間必然要順延。所以,這種方
法,只能用于,任務短小,且對時間精度要求不高的語境。
Timer是線程安全的,可以實現并發訪問。