Java定時器通信協(xié)議管理模塊Timer詳解
Timer詳解
Timer和TimerTask用于在后臺線程中調(diào)度任務(wù)的java.util類。TimerTask負(fù)責(zé)任務(wù)的執(zhí)行,Timer負(fù)責(zé)任務(wù)的調(diào)度。
定時功能
Timer提供了三種定時模式:
- 一次性任務(wù)
- 按照固定的延遲執(zhí)行(
fixed delay) - 按照固定的周期執(zhí)行(
fixed rate)
執(zhí)行一次
Timer提供了兩種方法,應(yīng)用于不同場景:
//在當(dāng)前時間往后delay個毫秒開始執(zhí)行
public void schedule(TimerTask task, long delay) {...}
//在指定的time時間點(diǎn)執(zhí)行
public void schedule(TimerTask task, Date time) {...}public static void main(String[] args) {
//定義一個Timer
Timer timer = new Timer("test-timer");
//定義一個TimerTask
TimerTask task = new TimerTask() {
@Override
public void run() {
System.out.println("任務(wù)執(zhí)行時間:" + new Date() + "------------"
+ "線程:" + Thread.currentThread().getName());
}
};
long delay = 3000L;
timer.schedule(task, delay);
System.out.println("任務(wù)添加時間:" + new Date() + "------------"
+ "線程:" + Thread.currentThread().getName());
}
工作方式:當(dāng)達(dá)到我們指定的時間,執(zhí)行一次結(jié)束
任務(wù)雖然運(yùn)行結(jié)束,但進(jìn)程沒有被銷毀。并且執(zhí)行任務(wù)的線程名為我們定義的Timer的名稱。
我們看一下源碼:
public class Timer {
//小頂堆,用來存放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),用來存放timerTaskTimerThread:任務(wù)執(zhí)行線程,繼承Thread類nextExecutionTime:假如任務(wù)需要多次執(zhí)行表示下一次執(zhí)行時間period:每次任務(wù)執(zhí)行間隔時間run():我們執(zhí)行任務(wù)的內(nèi)容
創(chuàng)建一個 Timer 對象就是新啟動了一個線程,但是這個新啟動的線程,并不是守護(hù)線程,它一直在后臺運(yùn)行,通過如下 可以將新啟動的 Timer 線程設(shè)置為守護(hù)線程。我們可以使用以下構(gòu)造方法(public Timer(boolean isDaemon)或public Timer(String name, boolean isDaemon))來設(shè)置。
Fixed Delay模式
//從當(dāng)前時間開始delay個毫秒數(shù)開始定期執(zhí)行,周期是period個毫秒數(shù)
public void schedule(TimerTask task, long delay, long period) {...}
////從指定的firstTime開始定期執(zhí)行,往后每次執(zhí)行的周期是period個毫秒數(shù)
public void schedule(TimerTask task, Date firstTime, long period){...}工作方式:
- 第一次執(zhí)行,按照指定時間開始(如果此時
TimerThread沒有執(zhí)行其他任務(wù)),如有其他任務(wù)在執(zhí)行,那就需要等到其他任務(wù)執(zhí)行完成才能執(zhí)行 - 第二次執(zhí)行,每次任務(wù)是上一次任務(wù)開始執(zhí)行時間加上執(zhí)行的
period時間。
到此這篇關(guān)于Java定時器通信協(xié)議管理模塊Timer詳解的文章就介紹到這了,更多相關(guān)Java Timer內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot 使用 OpenAPI3 規(guī)范整合 knife4j的詳細(xì)過程
Swagger工具集使用OpenAPI規(guī)范,可以生成、展示和測試基于OpenAPI規(guī)范的API文檔,并提供了生成客戶端代碼的功能,本文給大家介紹SpringBoot使用OpenAPI3規(guī)范整合knife4j的詳細(xì)過程,感興趣的朋友跟隨小編一起看看吧2023-12-12
Java實(shí)現(xiàn)微信網(wǎng)頁授權(quán)的示例代碼
這篇文章主要介紹了Java實(shí)現(xiàn)微信網(wǎng)頁授權(quán)的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-07-07
如何通過properties文件配置web.xml中的參數(shù)
這篇文章主要介紹了如何通過properties文件配置web.xml中的參數(shù)方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08
Mybatis實(shí)現(xiàn)插入數(shù)據(jù)后返回主鍵過程解析
這篇文章主要介紹了Mybatis實(shí)現(xiàn)插入數(shù)據(jù)后返回主鍵過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-06-06

