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)存放timerTask
TimerThread
:任務(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)文章
SpringBoot 使用 OpenAPI3 規(guī)范整合 knife4j的詳細(xì)過(guò)程
Swagger工具集使用OpenAPI規(guī)范,可以生成、展示和測(cè)試基于OpenAPI規(guī)范的API文檔,并提供了生成客戶端代碼的功能,本文給大家介紹SpringBoot使用OpenAPI3規(guī)范整合knife4j的詳細(xì)過(guò)程,感興趣的朋友跟隨小編一起看看吧2023-12-12SystemServer進(jìn)程啟動(dòng)過(guò)程解析
這篇文章主要為大家介紹了SystemServer進(jìn)程啟動(dòng)過(guò)程解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07Java實(shí)現(xiàn)微信網(wǎng)頁(yè)授權(quán)的示例代碼
這篇文章主要介紹了Java實(shí)現(xiàn)微信網(wǎng)頁(yè)授權(quán)的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-07-07如何通過(guò)properties文件配置web.xml中的參數(shù)
這篇文章主要介紹了如何通過(guò)properties文件配置web.xml中的參數(shù)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08Mybatis實(shí)現(xiàn)插入數(shù)據(jù)后返回主鍵過(guò)程解析
這篇文章主要介紹了Mybatis實(shí)現(xiàn)插入數(shù)據(jù)后返回主鍵過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06創(chuàng)建一個(gè)Java的不可變對(duì)象
這篇文章主要介紹了創(chuàng)建一個(gè)Java的不可變對(duì)象,一個(gè)類的對(duì)象在通過(guò)構(gòu)造方法創(chuàng)建后如果狀態(tài)不會(huì)再被改變,那么它就是一個(gè)不可變(immutable)類。它的所有成員變量的賦值僅在構(gòu)造方法中完成,不會(huì)提供任何 setter 方法供外部類去修改,需要的朋友可以參考下2021-11-11