更新時(shí)間:2020-05-18 15:23:42 來源:動(dòng)力節(jié)點(diǎn) 瀏覽3769次
什么是Timer
Timer是java.util工具包中提供的定時(shí)任務(wù)類。簡(jiǎn)潔易上手的使用方式,能幫我們快速構(gòu)建一個(gè)定時(shí)任務(wù)。
如何使用Timer
使用Timer配置與執(zhí)行定時(shí)任務(wù),由兩個(gè)部分組成
1.調(diào)度者Timer類
2.任務(wù)內(nèi)容類TimerTask類(該類實(shí)現(xiàn)了Runnable接口,TimerTask是一個(gè)虛類)
使用步驟
1.創(chuàng)建一個(gè)Timer對(duì)象
2.創(chuàng)建一個(gè)Task類,需要繼承TimerTask類,并且實(shí)現(xiàn)Runnable的run方法,用于定義具體的定時(shí)任務(wù)執(zhí)行內(nèi)容
3.調(diào)用Timer對(duì)象的schedule方法,并且將步驟的Task對(duì)象傳入,同時(shí)傳入需要延遲執(zhí)行的時(shí)間,和定時(shí)任務(wù)執(zhí)行的間隔時(shí)間。
從源碼分析Java定時(shí)任務(wù)工具類Timer
實(shí)現(xiàn)原理
Timer類原理
Timer類是一個(gè)調(diào)度者的角色。它包含了兩個(gè)最重要的部分:1.任務(wù)隊(duì)列TaskQueue2.調(diào)度線程TimerThread。
調(diào)度線程TimerThread
當(dāng)初始化一個(gè)Timer對(duì)象的時(shí)候,就會(huì)執(zhí)行TimerThread線程對(duì)象。該線程會(huì)進(jìn)入一個(gè)自旋,不斷查詢?nèi)蝿?wù)隊(duì)列TaskQueue,如果隊(duì)列為空,在線程等待。否則會(huì)獲取執(zhí)行時(shí)間,并且與當(dāng)前時(shí)間比較,如果未到執(zhí)行時(shí)間則等待差值。并且如果是重復(fù)執(zhí)行的任務(wù),會(huì)再次丟入任務(wù)隊(duì)列TaskQueue。
任務(wù)隊(duì)列TaskQueue
TaskQueue是一個(gè)小頂堆的數(shù)據(jù)結(jié)構(gòu),用于存儲(chǔ)TimerTask。因此可以保證每次從隊(duì)列中獲取的任務(wù)都是最近要執(zhí)行的任務(wù)。
當(dāng)Timer對(duì)象調(diào)用schedule方法時(shí),會(huì)將TimerTask丟入任務(wù)隊(duì)列,并且喚醒調(diào)度者線程
Timer類的缺點(diǎn)
1.imer是單線程的,如果一次執(zhí)行多個(gè)定時(shí)任務(wù),會(huì)導(dǎo)致某些任務(wù)被其他任務(wù)所阻塞。比如A任務(wù)每秒執(zhí)行一次,B任務(wù)10秒執(zhí)行一次,但是一次執(zhí)行5秒,就會(huì)導(dǎo)致A任務(wù)在長(zhǎng)達(dá)5秒都不會(huì)得到執(zhí)行機(jī)會(huì)。
2.Timer的執(zhí)行周期時(shí)間依賴于系統(tǒng)時(shí)間,timer中,獲取到堆頂任務(wù)執(zhí)行時(shí)間后,如果執(zhí)行時(shí)間還沒到,會(huì)計(jì)算出需要休眠的時(shí)間=(執(zhí)行時(shí)間-系統(tǒng)時(shí)間),如果系統(tǒng)時(shí)間被調(diào)整,就會(huì)導(dǎo)致休眠時(shí)間無限拉長(zhǎng),后面就算改回來了任務(wù)也因?yàn)樵谛菝咧卸貌坏綀?zhí)行的機(jī)會(huì)。
以上就是動(dòng)力節(jié)點(diǎn)java培訓(xùn)機(jī)構(gòu)的小編針對(duì)“Java編程入門,定時(shí)任務(wù)timer循環(huán)”的內(nèi)容進(jìn)行的回答,希望對(duì)大家有所幫助,如有疑問,請(qǐng)?jiān)诰€咨詢,有專業(yè)老師隨時(shí)為你服務(wù)。
相關(guān)閱讀
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
有基礎(chǔ) 直達(dá)就業(yè)
業(yè)余時(shí)間 高薪轉(zhuǎn)行
工作1~3年,加薪神器
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問老師會(huì)電話與您溝通安排學(xué)習(xí)