java timertask 定时_Java定时任务--Timer和TimerTask
1.程序和編程
我們知道,計算機程序是一組計算機能識別和執(zhí)行的指令,運行于電子計算機上,滿足人們某種需求的信息化工具。
簡單來說程序在本質(zhì)上是指令的集合,而編程從字面上來講就是編寫這些指令集合(程序),通過程序去完成某種行為。
在日常編程中,我們難免會遇到這種情況,如何在指定的時間去做某一件事情(比如鬧鐘響鈴)?在Java中通常使用定時任務(wù)去實現(xiàn),接下來會結(jié)合源碼分析Java中的定時任務(wù)。
2.從段子開始
上面是一個關(guān)于時間和線程的段子。當(dāng)然段子畢竟是為博眾人一笑,我們開發(fā)中獲取時間會有更好的方式。這里要說的是,如果我們要在下一天去做某個動作(比如上面說的鬧鐘響鈴),
這種線程睡眠不失為一種簡單的方法(雖然我們通常不建議使用這種方式,更傾向使用定時任務(wù))。
3.Java定時任務(wù)
簡單的說Timer中有兩個核心部分:
TimerThread是時間線程,控制TaskQueue中TimerTask的執(zhí)行;
TaskQueue是一個工具類,管理TimerTask數(shù)組
而Timer暴露的主要是一系列schedule方法,去建立Timer和TimerTask的聯(lián)系。我們看到Java定時任務(wù)設(shè)計中很重要的部分就是定時器和任務(wù)的分離。
以上是簡單的示例,在使用定時任務(wù)時要注意幾點:
一個Timer可以執(zhí)行多個TimerTask,但一個TimerTask只能被一個Timer使用(這和schedule中校驗TimerTask的狀態(tài)有關(guān),TimerTask的生命周期(由不同的狀態(tài)確定))。
通常不使用匿名類創(chuàng)建TimerTask抽象類的子類,建議創(chuàng)建單獨的子類extend TimerTask。
根據(jù)實際需要采用不同的schedule方法或者scheduleAtFixedRate方法執(zhí)行任務(wù)。
合理使用cancel和purge方法。
4.源碼淺析
結(jié)合第3部分的簡單示例,來梳理源碼。
①創(chuàng)建Timer和TimerTask
Timer的核心構(gòu)造方法,調(diào)用此方法時啟動,初始化創(chuàng)建的TimerThread線程。
?
②執(zhí)行schedule或scheduleAtFixedRate方法
其中核心的sched方法,主要是判斷線程的狀態(tài),TimerTask的狀態(tài),然后將通過校驗的TimerTask添加到TaskQueue,其后交由TimerThread管理。
③TimerThread原理
時間線程TimerThread中run方法執(zhí)行的mianLoop方法如上,會一直循環(huán)執(zhí)行。
a.獲取TaskQueue中的第一個序列的TimerTask(通過getMin()方法獲取),這里很重要,每次循環(huán)后TaskQueue序列可能會變化。
b.然后校驗TimerTask的狀態(tài),移除TaskQueue不需要執(zhí)行的TimerTask
c.對于能夠執(zhí)行的TimerTask,校驗當(dāng)前時間和執(zhí)行時間,?通過taskFired標(biāo)識(表示TimerTask是否就緒,可以執(zhí)行),(然后處理只執(zhí)行一次的,從TaskQueue中移除,按頻率執(zhí)行多次的重新排序,詳見rescheduleMin方法)。
d.未就緒的TimerTask將wait,而就緒(狀態(tài)正常且到執(zhí)行時間的TimerTask)的執(zhí)行TimerTask的run方法。此時該Timer中的TimerTask執(zhí)行完畢,后續(xù)的就是TimerTask線程邏輯。
④TaskQueue和TimerTask
結(jié)合源碼可以了解TaskQueue如何排序,以及TimerTask中不同的狀態(tài)(生命周期)的意義。
4.總結(jié)
Java原生的定時任務(wù)包括Timer和TimerTask兩部分,Timer為主,TimerTask為輔。
Timer中由TimerThread線程控制TimerTask是否執(zhí)行,Java通過這兩個類完成了定時任務(wù)的基本功能。
學(xué)習(xí)時不只是要學(xué)習(xí)其源碼中內(nèi)部實現(xiàn),工作原理。更要關(guān)注Timer和TimerTask分離的思想,這很重要。
后續(xù)學(xué)習(xí)Java中其他的定時任務(wù),如Spring的定時任務(wù),Quartz。
總結(jié)
以上是生活随笔為你收集整理的java timertask 定时_Java定时任务--Timer和TimerTask的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CKFinder
- 下一篇: [倚天屠龙记] vim 开篇