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