定时执行java程序_如何让Java程序定时运行
由于項(xiàng)目開發(fā)的需要,必須實(shí)現(xiàn)讓一個(gè)Java程
序定時(shí)運(yùn)行。比如,我的項(xiàng)目中,有一個(gè)網(wǎng)絡(luò)蜘蛛,需要從互聯(lián)網(wǎng)上抓取數(shù)據(jù),與其配合,有另一個(gè)程序來(lái)對(duì)新抓取的頁(yè)面進(jìn)行索引的創(chuàng)建,由于數(shù)據(jù)源更新頻率不
高,我們不可能讓蜘蛛無(wú)休無(wú)止地工作,或者忙等待新數(shù)據(jù)的產(chǎn)生,那樣只能造成浪費(fèi),而且非常地不禮貌,所以最理想的情況是,讓它每隔一個(gè)小時(shí)運(yùn)行一次,這
樣一天也就運(yùn)行不了幾次。
那么如何才能實(shí)現(xiàn)讓一個(gè)Java程序定時(shí)運(yùn)行呢?Java基本類庫(kù)里面,提供了兩個(gè)工具供我們使用,它們是java.util.Timer和java.util.TimerTask。
Timer是一個(gè)對(duì)象,這個(gè)對(duì)象在初始化之初,會(huì)創(chuàng)建一個(gè)后臺(tái)進(jìn)程(TimerThread),同時(shí)創(chuàng)建一個(gè)任務(wù)隊(duì)列(TaskQueue),然后
后臺(tái)進(jìn)程開始檢測(cè)TaskQueue中是否存在等待調(diào)度的任務(wù),如果存在,就運(yùn)行之,如果不存在,就等待(Object.wait())。
對(duì)于程序員可見的類是Timer和TimerTask,TimerTask是一個(gè)抽象類,是能夠被Timer所調(diào)度的一種對(duì)象,所有希望定時(shí)執(zhí)行的任務(wù),只要實(shí)現(xiàn)TimerTask類即可,然后使用Timer的schedule方法,給定一定的參數(shù),即可實(shí)現(xiàn)定時(shí)執(zhí)行,或者周期執(zhí)行。
schedule方法的本質(zhì),是將一個(gè)TimerTask對(duì)象添加到了TaskQueue中,這個(gè)TaskQueue是一個(gè)堆(可以動(dòng)態(tài)增長(zhǎng)),可以管理很多的Task。
Timer的本質(zhì),就是一個(gè)線程,按照指定的時(shí)間順序,來(lái)順次執(zhí)行一個(gè)又一個(gè)的任務(wù),根據(jù)這種性質(zhì),我們可以知道,Timer實(shí)現(xiàn)的定時(shí)不可能準(zhǔn)
確,而且,還會(huì)收到任務(wù)本身耗費(fèi)時(shí)間的干擾。如果前一個(gè)任務(wù)執(zhí)行時(shí)間過(guò)長(zhǎng),超過(guò)后一個(gè)任務(wù)的啟動(dòng)時(shí)間,則后一個(gè)任務(wù)的啟動(dòng)時(shí)間必然要順延。所以,這種方
法,只能用于,任務(wù)短小,且對(duì)時(shí)間精度要求不高的語(yǔ)境。
Timer是線程安全的,可以實(shí)現(xiàn)并發(fā)訪問(wèn)。
總結(jié)
以上是生活随笔為你收集整理的定时执行java程序_如何让Java程序定时运行的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: html5 密码框明文,elementU
- 下一篇: java 多重注解_Java注解-元数据