在開(kāi)發(fā)中,我們經(jīng)常需要一些周期性的操作,例如每隔幾分鐘就進(jìn)行某一項(xiàng)操作。這時(shí)候我們就要去設(shè)置個(gè)定時(shí)器,Java中最方便、最高效的實(shí)現(xiàn)方式是用java.util.Timer工具類(lèi),再通過(guò)調(diào)度java.util.TimerTask任務(wù)。
Timer是一種工具,線程用其安排以后在后臺(tái)線程中執(zhí)行的任務(wù)??砂才湃蝿?wù)執(zhí)行一次,或者定期重復(fù)執(zhí)行。實(shí)際上是個(gè)線程,定時(shí)調(diào)度所擁有的TimerTasks。
TimerTask是一個(gè)抽象類(lèi),它的子類(lèi)由Timer安排為一次執(zhí)行或重復(fù)執(zhí)行的任務(wù)。實(shí)際上就是一個(gè)擁有run方法的類(lèi),需要定時(shí)執(zhí)行的代碼放到run方法體內(nèi)。
java在jdk1.3中推出了定時(shí)器類(lèi)Timer,而后在jdk1.5后由DouLea從新開(kāi)發(fā)出了支持多線程的ScheduleThreadPoolExecutor,從后者的表現(xiàn)來(lái)看,可以考慮完全替代Timer了。
Timer與ScheduleThreadPoolExecutor對(duì)比:
1.Timer始于jdk1.3,其原理是利用一個(gè)TimerTask數(shù)組當(dāng)作隊(duì)列,將所有定時(shí)任務(wù)添加到此隊(duì)列里面去。然后啟動(dòng)一個(gè)線程,當(dāng)隊(duì)列為空時(shí),此線程會(huì)阻塞,當(dāng)隊(duì)列里面有數(shù)據(jù)時(shí),線程會(huì)去除一個(gè)TimerTask來(lái)判斷
是否到時(shí)間需要運(yùn)行此任務(wù),如果運(yùn)行時(shí)間小于或等于當(dāng)前時(shí)間時(shí)則開(kāi)始運(yùn)行任務(wù)。由于其單線程的本質(zhì),所以會(huì)帶來(lái)幾個(gè)問(wèn)題(詳細(xì)代碼在后面):
第一,當(dāng)我們添加到定時(shí)器中的任務(wù)比較耗時(shí)時(shí),由于此定時(shí)器是單線程順序執(zhí)行定時(shí)器任務(wù),所以會(huì)影響后續(xù)任務(wù)的按時(shí)執(zhí)行。
Java代碼
//問(wèn)題一示例: m_timer.scheduleAtFixedRate(new TaskUseLongTime(), 1000, 5000); m_timer.scheduleAtFixedRate(new TaskNormal(), 5000, 3000); 運(yùn)行結(jié)果: 14:44:29: timer is sleeping 10 seconds 14:44:39: Task Normal executed 14:44:39: timer is sleeping 10 seconds 14:44:49: Task Normal executed 14:44:49: Task Normal executed 14:44:49: timer is sleeping 10 seconds 結(jié)果分析:TaskNormal任務(wù)無(wú)法保證3秒運(yùn)行一次,其只能等待TaskUseLongTime運(yùn)行結(jié)束后才可以。
新聞名稱(chēng):淺談java定時(shí)器的發(fā)展歷程-創(chuàng)新互聯(lián)
文章地址:http://aaarwkj.com/article8/dopgop.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)網(wǎng)站制作、網(wǎng)站收錄、企業(yè)建站、云服務(wù)器、標(biāo)簽優(yōu)化、網(wǎng)站維護(hù)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容
營(yíng)銷(xiāo)型網(wǎng)站建設(shè)知識(shí)