摘要:類是一個定時任務(wù)類,該類實現(xiàn)了接口,而且是一個抽象類說明類是一個抽象類,由安排為一次執(zhí)行或重復(fù)執(zhí)行的任務(wù)。定時器實例有多種構(gòu)造方法創(chuàng)建一個新計時器。
Timer 的定義
有且僅有一個后臺線程對多個業(yè)務(wù)進行定時定頻的調(diào)度。Timer 類可以保證多個線程可以共享單個 Timer 對象而無需進行外部同步,所以 Timer 類是線程安全的。
核心的兩個類java.util.Timer 和 java.util.TimerTask
java.util.Timer。實際上是個線程,定時調(diào)度所擁有的 TimerTasks.
一個 TimerTask 實際上就是一個擁有 run() 方法的類,需要定時執(zhí)行的代碼放到run方法體內(nèi),TimerTask 一般是以匿名類的方式創(chuàng)建。
TimerTask 類是一個定時任務(wù)類,該類實現(xiàn)了 Runnable 接口,而且是一個抽象類
java.util.TimerTask
TimerTask 類是一個抽象類,由 Timer 安排為一次執(zhí)行或重復(fù)執(zhí)行的任務(wù)。
/* TimerTask 的類定義,為抽象類,并且實現(xiàn)了 Runnable 可以通過繼承該類,來實現(xiàn)自己的定時任務(wù)。*/ public abstract class TimerTask implements Runnable
它有一個抽象方法 run() 方法,該方法用于執(zhí)行相應(yīng)計時器任務(wù)要執(zhí)行的操作。因此每一個具體的任務(wù)類都必須繼承 TimerTask,然后重寫 run() 方法。
另外它還有兩個非抽象的方法:
boolean cancel():取消此計時器任務(wù)。
long scheduledExecutionTime():返回此任務(wù)最近實際執(zhí)行的安排執(zhí)行時間。
java.util.Timer
注意:javax.swing 包中也有一個Timer類,如果import中用到swing包, 要注意名字的沖突。
Timer 定時器實例有多種構(gòu)造方法:
Timer() : 創(chuàng)建一個新計時器。
Timer(boolean isDaemon) :創(chuàng)建一個新計時器,可以指定其相關(guān)的線程作為守護程序運行。
Timer(String name) :創(chuàng)建一個新計時器,其相關(guān)的線程具有指定的名稱。
Timer(String name, boolean isDaemon):創(chuàng)建一個新計時器,其相關(guān)的線程具有指定的名稱,并且可以指定作為守護程序運行。
Timer 定時器的schedule() (調(diào)度方法)
下面例子部分參數(shù)說明:
delay: 延遲執(zhí)行的毫秒數(shù),即在delay毫秒之后第一次執(zhí)行
period:重復(fù)執(zhí)行的時間間隔
/* time為Date類型:在指定時間執(zhí)行一次。 */ timer.schedule(task, time); /* firstTime為Date類型,period為long 從firstTime時刻開始,每隔period毫秒執(zhí)行一次。 */ timer.schedule(task, firstTime, period); /* delay 為 long類型:從現(xiàn)在起過delay毫秒執(zhí)行一次 */ timer.schedule(task, delay) /* delay 為 long, period 為 long:從現(xiàn)在起過delay毫秒以后,每隔 period 毫秒執(zhí)行一次。*/ timer.schedule(task, delay, period)
方法名稱 schedule() 和 scheduleAtFixedRate() 的區(qū)別
schedule() 方法更注重保持間隔時間的穩(wěn)定:保障每隔period時間可調(diào)用一次
scheduleAtFixedRate() 方法更注重保持執(zhí)行頻率的穩(wěn)定:保障多次調(diào)用的頻率趨近于period時間,如果任務(wù)執(zhí)行時間大于period,會在任務(wù)執(zhí)行之后馬上執(zhí)行下一次任務(wù)
scheduleAtFixedRate()
scheduleAtFixedRate(TimerTask task, Date firstTime, long period):安排指定的任務(wù)在指定的時間開始進行重復(fù)的固定速率執(zhí)行。
scheduleAtFixedRate(TimerTask task, long delay, long period):安排指定的任務(wù)在指定的延遲后開始進行重復(fù)的固定速率執(zhí)行。
實例代碼說明MyTimerTask.java
作為一個需要調(diào)度的任務(wù)類。
import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.TimerTask; public class MyTimerTask extends TimerTask { private String name; public MyTimerTask(String inputName) { name = inputName; } @Override public void run() { Calendar calendar = Calendar.getInstance(); SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println("current exec time is:"+ sf.format(calendar.getTime())); // 重寫來自于 TimerTask 的 run() System.out.println("Current exec name is:" + name); } public String getName() { return name; } public void setName(String name) { this.name = name; } }
MyTimer.java
測試調(diào)度 MyTimerTask
import java.util.Timer; public class MyTimer { public static void main(String[] args) { // 創(chuàng)建一個 timer 實例 Timer timer = new Timer(); // 創(chuàng)建一個 MyTimerTask 實例 MyTimerTask myTimerTask = new MyTimerTask("No.1"); /* 通過 timer 定時定頻調(diào)用 myTimerTask的業(yè)務(wù)邏輯 * 即第一次執(zhí)行是在當(dāng)前時間的兩秒之后,之后每隔一秒執(zhí)行一次 */ timer.schedule(myTimerTask, 2000L, 1000L); } }
輸出結(jié)果
current exec time is:2018-06-05 14:35:22 Current exec name is:No.1 current exec time is:2018-06-05 14:35:23 Current exec name is:No.1 current exec time is:2018-06-05 14:35:24 Current exec name is:No.1schedule() 的用法
代碼緊跟著上面的例子來做。
在時間等于或者超過 time 的時候執(zhí)行,且執(zhí)行一次
/* 獲取當(dāng)前時間,并設(shè)置成距離當(dāng)前時間3秒之后的時間 * 比如當(dāng)前時間為: 2018-06-05 23:59:58 * 則設(shè)置之后的時間為: 2018-06-06 00:00:00 */ Calendar calendar = Calendar.getInstance(); SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println("current exec time is:"+ sf.format(calendar.getTime())); calendar.add(Calendar.SECOND, 3); /* 在時間等于或者超過 time 的時候執(zhí)行,且執(zhí)行一次 */ myTimerTask.setName("schedule1"); timer.schedule(myTimerTask, calendar.getTime());
輸出的結(jié)果為:
current exec time is:2018-06-05 15:46:16 current exec time is:2018-06-05 15:46:19 Current exec name is:schedule1
時間等于或超過 time 的時候首次執(zhí)行,之后每隔 period 毫秒重復(fù)執(zhí)行一次 task
/* 獲取當(dāng)前時間,并設(shè)置成距離當(dāng)前時間3秒之后的時間 * 比如當(dāng)前時間為: 2018-06-05 23:59:58 * 則設(shè)置之后的時間為: 2018-06-06 00:00:00 */ Calendar calendar = Calendar.getInstance(); SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println("current exec time is:"+ sf.format(calendar.getTime())); calendar.add(Calendar.SECOND, 3); /** * 時間等于或超過 time 的時候首次執(zhí)行,之后每隔 period 毫秒重復(fù)執(zhí)行一次 task */ myTimerTask.setName("schedule2"); timer.schedule(myTimerTask, calendar.getTime(), 3000L);
輸出的結(jié)果為:
current exec time is:2018-06-05 15:54:32 current exec time is:2018-06-05 15:54:35 Current exec name is:schedule2 current exec time is:2018-06-05 15:54:38 Current exec name is:schedule2 current exec time is:2018-06-05 15:54:41 Current exec name is:schedule2
等待 delay 毫秒之后執(zhí)行且執(zhí)行一次 task
/** * 等待 delay 毫秒之后執(zhí)行且執(zhí)行一次 task */ myTimerTask.setName("schedule3"); timer.schedule(myTimerTask, 1000);
輸出結(jié)果為:
current exec time is:2018-06-05 16:00:06 current exec time is:2018-06-05 16:00:07 Current exec name is:schedule3
等待 delay 毫秒之后,首次執(zhí)行,并且之后每隔 period 毫秒重復(fù)執(zhí)行一次 task
/** * 等待 delay 毫秒之后,首次執(zhí)行,并且之后每隔 period 毫秒重復(fù)執(zhí)行一次 task */ myTimerTask.setName("schedule4"); timer.schedule(myTimerTask, 1000, 3000);
輸出結(jié)果為:
current exec time is:2018-06-05 16:01:36 current exec time is:2018-06-05 16:01:37 Current exec name is:schedule4 current exec time is:2018-06-05 16:01:40 Current exec name is:schedule4 current exec time is:2018-06-05 16:01:43 Current exec name is:schedule4scheduleAtFixedRate() 的用法
時間等于或者超過 time 時首次執(zhí)行 task,之后每隔 period 毫秒重復(fù)執(zhí)行一次
/* 獲取當(dāng)前時間,并設(shè)置成距離當(dāng)前時間3秒之后的時間 * 比如當(dāng)前時間為: 2018-06-05 23:59:58 * 則設(shè)置之后的時間為: 2018-06-06 00:00:00 */ Calendar calendar = Calendar.getInstance(); SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println("current exec time is:"+ sf.format(calendar.getTime())); calendar.add(Calendar.SECOND, 3); /* 時間等于或者超過 time 時首次執(zhí)行 task,之后每隔 period 毫秒重復(fù)執(zhí)行一次 */ myTimerTask.setName("scheduleAtFixedRate1"); timer.scheduleAtFixedRate(myTimerTask, calendar.getTime(), 3000);
輸出的結(jié)果為:
current exec time is:2018-06-05 16:11:48 current exec time is:2018-06-05 16:11:51 Current exec name is:scheduleAtFixedRate1 current exec time is:2018-06-05 16:11:54 Current exec name is:scheduleAtFixedRate1 current exec time is:2018-06-05 16:11:57 Current exec name is:scheduleAtFixedRate1
等待 delay 毫秒之后,首次執(zhí)行,并且之后每隔 period 毫秒重復(fù)執(zhí)行一次 task
/* 等待 delay 毫秒之后,首次執(zhí)行,并且之后每隔 period 毫秒重復(fù)執(zhí)行一次 task */ myTimerTask.setName("scheduleAtFixedRate2"); timer.scheduleAtFixedRate(myTimerTask, 1000, 3000);
輸出的結(jié)果為:
current exec time is:2018-06-05 16:15:47 current exec time is:2018-06-05 16:15:48 Current exec name is:scheduleAtFixedRate2 current exec time is:2018-06-05 16:15:51 Current exec name is:scheduleAtFixedRate2 current exec time is:2018-06-05 16:15:54 Current exec name is:scheduleAtFixedRate2
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/71600.html
摘要:代碼實例獲取當(dāng)前時間按照指定的格式輸出設(shè)置成秒之前的時間使用來執(zhí)行控制臺輸出方法總結(jié)我們可以看到實際的效果是在啟動執(zhí)行的時候,會立馬執(zhí)行次就是為了追趕已經(jīng)過去的秒。 方法名稱 schedule() 和 scheduleAtFixedRate() 的區(qū)別 兩種情況看區(qū)別 首次計劃執(zhí)行的時間早于當(dāng)前時間 比如說:當(dāng)前時間是 11:06, 但是首次計劃執(zhí)行的時間應(yīng)該為: 11:00 任務(wù)執(zhí)行...
時間:2017年05月24日星期三說明:本文部分內(nèi)容均來自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com教學(xué)示例源碼:無個人學(xué)習(xí)源碼:https://github.com/zccodere/s... 第一章:課程介紹 1-1 課程介紹 什么是定時任務(wù)調(diào)度 基于給定的時間點,給定的時間間隔或者給定的執(zhí)行次數(shù)自動執(zhí)行的任務(wù) 在Java中的定時調(diào)度工具 Timer:小弟,能實現(xiàn)日常60%的定...
摘要:本人郵箱歡迎轉(zhuǎn)載轉(zhuǎn)載請注明網(wǎng)址代碼已經(jīng)全部托管有需要的同學(xué)自行下載引言同步工具都講的差不多了今天我們換一下口味講一下定時任務(wù)吧理論延時后執(zhí)行定時任務(wù)到達這個時間點執(zhí)行定時任務(wù)延時后執(zhí)行定時任務(wù)之后以為周期重復(fù)執(zhí)行到達這個時間點執(zhí)行定時任務(wù)之 本人郵箱: 歡迎轉(zhuǎn)載,轉(zhuǎn)載請注明網(wǎng)址 http://blog.csdn.net/tianshi_kcogithub: https://github...
摘要:設(shè)置一個定時器,定時詢問服務(wù)器是否有信息,每次建立連接傳輸數(shù)據(jù)之后,鏈接會關(guān)閉。通過調(diào)用此程序提供的套接口接口與服務(wù)器端的套接口進行通信。 本文同步自我的博客園:http://hustskyking.cnblogs.com P.S: 各個平臺中就 segmentFault 寫博客體驗最好了! web通信,一個特別大的topic,涉及面也是很廣的。因最近學(xué)習(xí)了 javascript 中...
摘要:前言周末嘗試了一下新的功能來封裝一個組件,遇到一個,所以記錄一下過程報錯如下大概意思是組件已經(jīng)卸載了,但在卸載之后還執(zhí)行了一個對組件更新的操作,這是一個無效的操作,但它表示應(yīng)用程序中存在內(nèi)存泄漏。 showImg(https://segmentfault.com/img/bVbkD9k?w=1008&h=298); 前言 周末嘗試了一下React新的hooks功能,來封裝一個組件,...
閱讀 1424·2021-11-15 11:45
閱讀 3190·2021-09-27 13:36
閱讀 2922·2019-08-30 15:54
閱讀 1046·2019-08-29 12:38
閱讀 2975·2019-08-29 11:22
閱讀 3065·2019-08-26 13:52
閱讀 2100·2019-08-26 13:30
閱讀 657·2019-08-26 10:37