Java通過Timer與TimerTask實現(xiàn)定時任務(wù)調(diào)度方式
前言
在實際的工作當(dāng)中,經(jīng)常要用到定時去操作一下任務(wù),例如:數(shù)據(jù)的定時備份,用戶的定時短信發(fā)送,定時刷新緩存等等。下面介紹實現(xiàn)的兩個基礎(chǔ)工具類Timer與TimerTask。
提示:以下是本篇文章正文內(nèi)容,下面案例可供參考
一、什么Timer類
1、Timer類是一種線程設(shè)施,可以用來實現(xiàn)在某一個時間或某一段時間后安排某一個任務(wù)執(zhí)行一次或定期重復(fù)執(zhí)行。
2、該功能要與TimerTask類配合使用,TimerTask類是用來實現(xiàn)由Timer創(chuàng)建的一次或者重復(fù)執(zhí)行的某一個任務(wù)。
3、每一個Timer對象對應(yīng)一個線程,因此定時計數(shù)器所執(zhí)行的任務(wù)應(yīng)該迅速完成,否則可能會延遲后續(xù)任務(wù)的執(zhí)行,而這寫后續(xù)的任務(wù)就有可能堆在一起,等到任務(wù)執(zhí)行完成之后才能快速連續(xù)執(zhí)行。
Timer類常用的方法
方法 | 描述 |
---|---|
public Timer() | 創(chuàng)建一個計時器并啟動該計時器 |
public void cancel() | 用來終止該計時器,并放棄所有己安排的任務(wù),對當(dāng)前正在執(zhí)行的任務(wù)沒有影響 |
public int purge() | 將所有己經(jīng)取消的任務(wù)刪除,一般用來釋放內(nèi)存空間 |
public void schedule(TimerTask task, Date time) | 安排一個任務(wù)在指定的時間執(zhí)行,如果己經(jīng)超過該時間,則立即執(zhí)行 |
public void schedule(TimerTask task, Date firstTime, long period) | 安排一個任務(wù)在指定的時間執(zhí)行,然后以固定的頻率(單位:ms)重復(fù)執(zhí)行 |
public void schedule(TimerTask task, long delay) | 安排一個任務(wù)在一段時間(單位:ms)后執(zhí)行 |
public void schedule(TimerTask task, long delay, long period) | 安排一個任務(wù)在一段時間(單位:ms)后執(zhí)行,然后以固定的頻率 (單位:ms)重復(fù)執(zhí)行 |
public void scheduleAtFixedRate(TimerTask task, Date firstTime, long period) | 安排一個任務(wù)在指定的時間執(zhí)行,然后以近似固定的頻率 (單位:ms) 重復(fù)執(zhí)行 |
public void scheduleAtFixedRate(TimerTask task, long delay, long period) | 安排一個任務(wù)在一段時間(單位:ms)后普通執(zhí)行,然后以近似固定的頻率 (單位:毫秒)重復(fù)執(zhí)行 |
備注:在這里需要說明的是:schedule()與scheduleAtrixedRare()方法的區(qū)別在于重復(fù)執(zhí)行任務(wù)時對于時間間隔出現(xiàn)延遲的情況處理:
(1)、schedule()方法的執(zhí)行時間間隔水遠(yuǎn)是固定的,如果之前出現(xiàn)了延遲的情況,之后也會繼續(xù)按照設(shè)定好的時間間隔來執(zhí)行。
(2)、scheduleAtrixedRare()方法可以根據(jù)出現(xiàn)的延時時間自動調(diào)整下一次間隔的執(zhí)行時間。
二、什么TimerTask類
要想執(zhí)行具體的定時任務(wù),就要必須使用TimerTask類,TimerTask類是一個抽象類,使用的時候需要繼承該類,并實現(xiàn)抽象房方法。
TimerTask類常用的方法,以及實現(xiàn)接口的順序圖
方法 | 描述 |
---|---|
public boolean cancel() | 用來終止該計時器,并放棄所有己安排的任務(wù),對當(dāng)前正在執(zhí)行的任務(wù)沒有影響 |
public abstract void run() | 該任務(wù)所要執(zhí)行的具體操作,該方法為引入的接口 Runnable 中的方法,子類需要覆寫此方法 |
public long scheduledExecutionTime() | 返回最近一次要執(zhí)行該任務(wù)的時間(如果正在執(zhí)行,則返回此任務(wù)的執(zhí)行安排時間),一般在run()方法中調(diào)用,用來判斷當(dāng)前是否有足夠的時問來執(zhí)行完成該任務(wù) |
三、代碼實現(xiàn)定時調(diào)度
1.創(chuàng)建DuTask類
繼承TimerTask類,實現(xiàn)調(diào)度的能力,用于執(zhí)行業(yè)務(wù)邏輯
/** * @author zhx * @date 2021-12-19 */ public class DuTask extends TimerTask { @Override public void run() { SimpleDateFormat sDate=null; sDate=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS"); System.out.println("當(dāng)前時間執(zhí)行任務(wù)的時間為:"+sDate.format(new Date())); } }
2.創(chuàng)建測試TestDuTask類
進(jìn)行任務(wù)調(diào)度
/** * @author zhx * @date 2021-12-19 */ public class TestDuTask { public static void main(String[] args) { Timer timer = new Timer();//創(chuàng)建Timer類對象 DuTask task = new DuTask();//定時任務(wù) //設(shè)置定時任務(wù)執(zhí)行: 1秒后開始,每3秒重復(fù)執(zhí)行 timer.schedule(task,1000,3000); } }
驗證效果截圖
間隔3秒執(zhí)行的
總結(jié)
當(dāng)然這執(zhí)行我們在實際開過程中實現(xiàn)任務(wù)調(diào)度的方法之一,后續(xù)我將講解第二種方式JobDetail實現(xiàn)定時任務(wù)調(diào)度。
相關(guān)文章
Java描述數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí)之鏈表的增刪改查詳解
這篇文章主要給大家介紹了關(guān)于Java描述數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí)之鏈表的增刪改查的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-05-05java 刪除文件夾中的所有內(nèi)容而不刪除文件夾本身的實例
下面小編就為大家?guī)硪黄猨ava 刪除文件夾中的所有內(nèi)容而不刪除文件夾本身的實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-12-12java使用正則表達(dá)為數(shù)字添加千位符的簡單方法
這篇文章主要介紹了java使用正則表達(dá)為數(shù)字添加千位符的簡單方法,需要的朋友可以參考下2014-04-04Java?如何接收kernel傳過來的數(shù)組(推薦)
這篇文章主要介紹了Java?如何接收kernel傳過來的數(shù)組,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧2024-08-08