Java定時(shí)器通信協(xié)議管理模塊Timer詳解
Timer詳解
Timer和TimerTask用于在后臺(tái)線程中調(diào)度任務(wù)的java.util類。TimerTask負(fù)責(zé)任務(wù)的執(zhí)行,Timer負(fù)責(zé)任務(wù)的調(diào)度。
定時(shí)功能
Timer提供了三種定時(shí)模式:
- 一次性任務(wù)
- 按照固定的延遲執(zhí)行(
fixed delay) - 按照固定的周期執(zhí)行(
fixed rate)
執(zhí)行一次
Timer提供了兩種方法,應(yīng)用于不同場(chǎng)景:
//在當(dāng)前時(shí)間往后delay個(gè)毫秒開(kāi)始執(zhí)行
public void schedule(TimerTask task, long delay) {...}
//在指定的time時(shí)間點(diǎn)執(zhí)行
public void schedule(TimerTask task, Date time) {...}public static void main(String[] args) {
//定義一個(gè)Timer
Timer timer = new Timer("test-timer");
//定義一個(gè)TimerTask
TimerTask task = new TimerTask() {
@Override
public void run() {
System.out.println("任務(wù)執(zhí)行時(shí)間:" + new Date() + "------------"
+ "線程:" + Thread.currentThread().getName());
}
};
long delay = 3000L;
timer.schedule(task, delay);
System.out.println("任務(wù)添加時(shí)間:" + new Date() + "------------"
+ "線程:" + Thread.currentThread().getName());
}
工作方式:當(dāng)達(dá)到我們指定的時(shí)間,執(zhí)行一次結(jié)束
任務(wù)雖然運(yùn)行結(jié)束,但進(jìn)程沒(méi)有被銷毀。并且執(zhí)行任務(wù)的線程名為我們定義的Timer的名稱。
我們看一下源碼:
public class Timer {
//小頂堆,用來(lái)存放timeTask
private final TaskQueue queue = new TaskQueue();
private final TimerThread thread = new TimerThread(queue);
public Timer(String name) {
thread.setName(name);
thread.start();
}
}
public abstract class TimerTask implements Runnable {
long nextExecutionTime;
long period = 0;
public abstract void run();
}TaskQueue:基于小頂堆實(shí)現(xiàn),用來(lái)存放timerTaskTimerThread:任務(wù)執(zhí)行線程,繼承Thread類nextExecutionTime:假如任務(wù)需要多次執(zhí)行表示下一次執(zhí)行時(shí)間period:每次任務(wù)執(zhí)行間隔時(shí)間run():我們執(zhí)行任務(wù)的內(nèi)容
創(chuàng)建一個(gè) Timer 對(duì)象就是新啟動(dòng)了一個(gè)線程,但是這個(gè)新啟動(dòng)的線程,并不是守護(hù)線程,它一直在后臺(tái)運(yùn)行,通過(guò)如下 可以將新啟動(dòng)的 Timer 線程設(shè)置為守護(hù)線程。我們可以使用以下構(gòu)造方法(public Timer(boolean isDaemon)或public Timer(String name, boolean isDaemon))來(lái)設(shè)置。
Fixed Delay模式
//從當(dāng)前時(shí)間開(kāi)始delay個(gè)毫秒數(shù)開(kāi)始定期執(zhí)行,周期是period個(gè)毫秒數(shù)
public void schedule(TimerTask task, long delay, long period) {...}
////從指定的firstTime開(kāi)始定期執(zhí)行,往后每次執(zhí)行的周期是period個(gè)毫秒數(shù)
public void schedule(TimerTask task, Date firstTime, long period){...}工作方式:
- 第一次執(zhí)行,按照指定時(shí)間開(kāi)始(如果此時(shí)
TimerThread沒(méi)有執(zhí)行其他任務(wù)),如有其他任務(wù)在執(zhí)行,那就需要等到其他任務(wù)執(zhí)行完成才能執(zhí)行 - 第二次執(zhí)行,每次任務(wù)是上一次任務(wù)開(kāi)始執(zhí)行時(shí)間加上執(zhí)行的
period時(shí)間。
到此這篇關(guān)于Java定時(shí)器通信協(xié)議管理模塊Timer詳解的文章就介紹到這了,更多相關(guān)Java Timer內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MyEclipse整合ssh三大框架環(huán)境搭載用戶注冊(cè)源碼下載
這篇文章主要為大家詳細(xì)介紹了如何使用MyEclipse整合ssh三大框架進(jìn)行環(huán)境搭載,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-10-10
使用springboot不自動(dòng)初始化數(shù)據(jù)庫(kù)連接池
這篇文章主要介紹了使用springboot不自動(dòng)初始化數(shù)據(jù)庫(kù)連接池,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09
spring 整合mybatis后用不上session緩存的原因分析
因?yàn)橐恢庇胹pring整合了mybatis,所以很少用到mybatis的session緩存。什么原因呢?下面小編給大家介紹spring 整合mybatis后用不上session緩存的原因分析,需要的朋友可以參考下2017-02-02
教你怎么用Java數(shù)組和鏈表實(shí)現(xiàn)棧
本篇文章為大家詳細(xì)介紹了怎么用Java數(shù)組和鏈表實(shí)現(xiàn)棧,文中有非常詳細(xì)的代碼示例及注釋,對(duì)正在學(xué)習(xí)java的小伙伴們很有幫助,需要的朋友可以參考下2021-05-05
Windows系統(tǒng)下JDK1.8與JDK11版本切換超詳細(xì)教程
這篇文章主要給大家介紹了關(guān)于Windows系統(tǒng)下JDK1.8與JDK11版本切換的超詳細(xì)教程,我們可以有多個(gè)工程項(xiàng)目,用的JDK版本不一樣,這個(gè)時(shí)候就需要進(jìn)行自由切換JDK版本了,需要的朋友可以參考下2023-07-07
VsCode配置java環(huán)境的詳細(xì)圖文教程
vscode是一個(gè)免費(fèi)的代碼編輯器,支持多種主題,應(yīng)用起來(lái)簡(jiǎn)單方便,下面這篇文章主要給大家介紹了關(guān)于VsCode配置java環(huán)境的詳細(xì)圖文教程,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-02-02
Spring Task定時(shí)任務(wù)的配置和使用詳解
本篇文章主要介紹了Spring Task定時(shí)任務(wù)的配置和使用詳解,實(shí)例分析了Spring Task定時(shí)任務(wù)的配置和使用的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2017-04-04

