您好,登錄后才能下訂單哦!
使用 Java 來調(diào)度定時(shí)任務(wù)時(shí),我們經(jīng)常會(huì)使用 Timer 類搞定。Timer 簡(jiǎn)單易用,在一些業(yè)務(wù)場(chǎng)景下用來實(shí)現(xiàn)簡(jiǎn)單定時(shí)調(diào)度。
// 5秒后開始執(zhí)行,每秒執(zhí)行一次 Timer timer = new Timer(); timer.schedule(new TimerTask() { public void run() { System.out.println("hello world"); } }, 50000 , 1000);
經(jīng)過delay(ms)后開始進(jìn)行調(diào)度,僅僅調(diào)度一次。
public void schedule(TimerTask task, long delay)
在指定的時(shí)間點(diǎn)time上調(diào)度一次
public void schedule(TimerTask task, Date time)
在delay(ms)后開始調(diào)度,每次調(diào)度完后,最少等待period(ms)后才開始調(diào)度
public void schedule(TimerTask task, long delay, long period)
在到了指定時(shí)間后開始調(diào)度,每次調(diào)度完后,最少等待period(ms)后才開始調(diào)度。
public void schedule(TimerTask task, Date firstTime, long period)
在delay(ms)后開始調(diào)度,然后每經(jīng)過period(ms)再次調(diào)度。
public void scheduleAtFixedRate(TimerTask task, long delay, long period)
schedule方法的區(qū)別在于:
schedule在計(jì)算下一次執(zhí)行的時(shí)間的時(shí)候,是通過當(dāng)前時(shí)間(在任務(wù)執(zhí)行前得到) + 時(shí)間片,而scheduleAtFixedRate方法是通過當(dāng)前需要執(zhí)行的時(shí)間(也就是計(jì)算出現(xiàn)在應(yīng)該執(zhí)行的時(shí)間)+ 時(shí)間片,前者是運(yùn)行的實(shí)際時(shí)間,而后者是理論時(shí)間點(diǎn)。比如:
在到了指定時(shí)間后開始調(diào)度,每次調(diào)度完后,最少等待period(ms)后才開始調(diào)度。
public void scheduleAtFixedRate(TimerTask task, Date firstTime,long period)
Timer 類里包含一個(gè)任務(wù)隊(duì)列和一個(gè)異步輪詢線程。任務(wù)隊(duì)列里容納了所有待執(zhí)行的任務(wù),所有的任務(wù)將會(huì)在這一個(gè)異步線程里執(zhí)行,切記:
public class Timer { private final TaskQueue queue = new TaskQueue(); private final TimerThread thread = new TimerThread(queue); }
Timer 的任務(wù)隊(duì)列 TaskQueue 是一個(gè)特殊的隊(duì)列,它內(nèi)部是一個(gè)數(shù)組。這個(gè)數(shù)組會(huì)按照待執(zhí)行時(shí)間進(jìn)行堆排序,堆頂元素總是待執(zhí)行時(shí)間最小的任務(wù)。
更多關(guān)于Jave時(shí)間類庫(kù)Timer的使用方法與實(shí)例請(qǐng)查看下面的相關(guān)鏈接
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。