Java通過Timer與TimerTask實現定時任務調度方式
前言
在實際的工作當中,經常要用到定時去操作一下任務,例如:數據的定時備份,用戶的定時短信發(fā)送,定時刷新緩存等等。下面介紹實現的兩個基礎工具類Timer與TimerTask。
提示:以下是本篇文章正文內容,下面案例可供參考
一、什么Timer類
1、Timer類是一種線程設施,可以用來實現在某一個時間或某一段時間后安排某一個任務執(zhí)行一次或定期重復執(zhí)行。
2、該功能要與TimerTask類配合使用,TimerTask類是用來實現由Timer創(chuàng)建的一次或者重復執(zhí)行的某一個任務。
3、每一個Timer對象對應一個線程,因此定時計數器所執(zhí)行的任務應該迅速完成,否則可能會延遲后續(xù)任務的執(zhí)行,而這寫后續(xù)的任務就有可能堆在一起,等到任務執(zhí)行完成之后才能快速連續(xù)執(zhí)行。
Timer類常用的方法
方法 | 描述 |
---|---|
public Timer() | 創(chuàng)建一個計時器并啟動該計時器 |
public void cancel() | 用來終止該計時器,并放棄所有己安排的任務,對當前正在執(zhí)行的任務沒有影響 |
public int purge() | 將所有己經取消的任務刪除,一般用來釋放內存空間 |
public void schedule(TimerTask task, Date time) | 安排一個任務在指定的時間執(zhí)行,如果己經超過該時間,則立即執(zhí)行 |
public void schedule(TimerTask task, Date firstTime, long period) | 安排一個任務在指定的時間執(zhí)行,然后以固定的頻率(單位:ms)重復執(zhí)行 |
public void schedule(TimerTask task, long delay) | 安排一個任務在一段時間(單位:ms)后執(zhí)行 |
public void schedule(TimerTask task, long delay, long period) | 安排一個任務在一段時間(單位:ms)后執(zhí)行,然后以固定的頻率 (單位:ms)重復執(zhí)行 |
public void scheduleAtFixedRate(TimerTask task, Date firstTime, long period) | 安排一個任務在指定的時間執(zhí)行,然后以近似固定的頻率 (單位:ms) 重復執(zhí)行 |
public void scheduleAtFixedRate(TimerTask task, long delay, long period) | 安排一個任務在一段時間(單位:ms)后普通執(zhí)行,然后以近似固定的頻率 (單位:毫秒)重復執(zhí)行 |
備注:在這里需要說明的是:schedule()與scheduleAtrixedRare()方法的區(qū)別在于重復執(zhí)行任務時對于時間間隔出現延遲的情況處理:
(1)、schedule()方法的執(zhí)行時間間隔水遠是固定的,如果之前出現了延遲的情況,之后也會繼續(xù)按照設定好的時間間隔來執(zhí)行。
(2)、scheduleAtrixedRare()方法可以根據出現的延時時間自動調整下一次間隔的執(zhí)行時間。
二、什么TimerTask類
要想執(zhí)行具體的定時任務,就要必須使用TimerTask類,TimerTask類是一個抽象類,使用的時候需要繼承該類,并實現抽象房方法。
TimerTask類常用的方法,以及實現接口的順序圖
方法 | 描述 |
---|---|
public boolean cancel() | 用來終止該計時器,并放棄所有己安排的任務,對當前正在執(zhí)行的任務沒有影響 |
public abstract void run() | 該任務所要執(zhí)行的具體操作,該方法為引入的接口 Runnable 中的方法,子類需要覆寫此方法 |
public long scheduledExecutionTime() | 返回最近一次要執(zhí)行該任務的時間(如果正在執(zhí)行,則返回此任務的執(zhí)行安排時間),一般在run()方法中調用,用來判斷當前是否有足夠的時問來執(zhí)行完成該任務 |
三、代碼實現定時調度
1.創(chuàng)建DuTask類
繼承TimerTask類,實現調度的能力,用于執(zhí)行業(yè)務邏輯
/** * @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("當前時間執(zhí)行任務的時間為:"+sDate.format(new Date())); } }
2.創(chuàng)建測試TestDuTask類
進行任務調度
/** * @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();//定時任務 //設置定時任務執(zhí)行: 1秒后開始,每3秒重復執(zhí)行 timer.schedule(task,1000,3000); } }
驗證效果截圖
間隔3秒執(zhí)行的
總結
當然這執(zhí)行我們在實際開過程中實現任務調度的方法之一,后續(xù)我將講解第二種方式JobDetail實現定時任務調度。