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