摘要:代碼實例獲取當前時間按照指定的格式輸出設置成秒之前的時間使用來執行控制臺輸出方法總結我們可以看到實際的效果是在啟動執行的時候,會立馬執行次就是為了追趕已經過去的秒。
方法名稱 schedule() 和 scheduleAtFixedRate() 的區別
兩種情況看區別
首次計劃執行的時間早于當前時間
比如說:當前時間是 11:06, 但是首次計劃執行的時間應該為: 11:00
任務執行所需的時間超出任務的執行周期間隔
比如說:我們執行的任務的時間為 3秒,但是任務執行的周期間隔為 2秒。
詳細分析 首次計劃的時間早于當前時間 schedule 方法fixed-delay; 如果第一次執行的時間被 delay 了,隨后的執行時間按照上一次實際執行完成的時間點進行計算。
代碼實例
import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Timer; import java.util.TimerTask; public class DifferenceTest { public static void main(String[] args) { // 獲取當前時間按照指定的格式輸出 final SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Calendar calendar = Calendar.getInstance(); System.out.println("current time is:"+ sf.format(calendar.getTime())); // 設置成6秒之前的時間 calendar.add(Calendar.SECOND, -6); System.out.println("current time minus six second is :"+ sf.format(calendar.getTime())); System.out.println("Task is being executed!"); // 使用 timer 來執行 Timer timer = new Timer(); timer.schedule(new TimerTask() { @Override public void run() { // TODO Auto-generated method stub System.out.println("scheduled exec time is :"+ sf.format(scheduledExecutionTime())); } }, calendar.getTime(), 2000); } }
控制臺輸出
current time is:2018-07-05 13:09:57 current time minus six second is :2018-07-05 13:09:51 scheduled exec time is :2018-07-05 13:09:57 scheduled exec time is :2018-07-05 13:09:59 scheduled exec time is :2018-07-05 13:10:01 scheduled exec time is :2018-07-05 13:10:03 scheduled exec time is :2018-07-05 13:10:05 scheduled exec time is :2018-07-05 13:10:07 scheduled exec time is :2018-07-05 13:10:09
schedule 方法總結
雖然我們是將事件提前了6秒,但是使用 schedule 還是從當前時間開始執行。然后每隔兩秒執行一次。
scheduleAtFixedRate 方法fixed-rate; 如果第一次執行時間被 delay了,隨后的執行時間按照上一次開始的點計算,并且為了趕上進度會多次執行任務,因為 TimerTask中的執行需要考慮同步。
代碼實例
import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Timer; import java.util.TimerTask; public class DifferenceTest { public static void main(String[] args) { // 獲取當前時間按照指定的格式輸出 final SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Calendar calendar = Calendar.getInstance(); System.out.println("current time is:"+ sf.format(calendar.getTime())); // 設置成6秒之前的時間 calendar.add(Calendar.SECOND, -6); System.out.println("current time minus six second is :"+ sf.format(calendar.getTime())); // 使用 timer 來執行 Timer timer = new Timer(); timer.scheduleAtFixedRate(new TimerTask() { @Override public void run() { // TODO Auto-generated method stub System.out.println("scheduled exec time is :"+ sf.format(scheduledExecutionTime())); } }, calendar.getTime(), 2000); } }
控制臺輸出
current time is:2018-07-06 14:32:34 current time minus six second is :2018-07-06 14:32:28 scheduled exec time is :2018-07-06 14:32:28 scheduled exec time is :2018-07-06 14:32:30 scheduled exec time is :2018-07-06 14:32:32 scheduled exec time is :2018-07-06 14:32:34 scheduled exec time is :2018-07-06 14:32:36 scheduled exec time is :2018-07-06 14:32:38
scheduleAtFixedRate 方法總結
我們可以看到實際的效果是:在啟動執行的時候,會立馬執行3次,就是為了追趕已經過去的6秒。然后再按照設定的間隔,每兩秒鐘執行一次。
任務執行所需的時間超出任務的執行周期間隔 schedule 方法下次執行時間相當于上一次實際執行完成的時間點,因為執行的時間會不斷延后。
代碼實例
import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Timer; import java.util.TimerTask; public class DifferenceTest { public static void main(String[] args) { // 獲取當前時間按照指定的格式輸出 final SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Calendar calendar = Calendar.getInstance(); System.out.println("current time is:"+ sf.format(calendar.getTime())); // 使用 timer 來執行 Timer timer = new Timer(); timer.schedule(new TimerTask() { @Override public void run() { // 模擬當前執行的過程需要 3秒 try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } // 打印最近一次執行的時間 System.out.println("scheduled exec time is :"+ sf.format(scheduledExecutionTime())); } }, calendar.getTime(), 2000); } }
控制臺輸出
current time is:2018-07-06 14:43:51 scheduled exec time is :2018-07-06 14:43:51 scheduled exec time is :2018-07-06 14:43:54 scheduled exec time is :2018-07-06 14:43:57 scheduled exec time is :2018-07-06 14:44:00 scheduled exec time is :2018-07-06 14:44:03
說明
我們可以空控制臺中輸出的結果中看到:我們當前的時間為 14:43:51,然后第一次計劃執行的時間也為 14:43:51。但是以后每次執行的時間都是相隔 3秒鐘,并不是我們上面設置 timerTask 的時間間隔 2秒。所以說使用 schedule 方法,在這種情況下會不斷的延后。
scheduleAtFixedRate 方法下一次執行時間相對于上一次開始的時間點,因此執行時間一般不會延后,因此存在并發性
代碼實例
import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Timer; import java.util.TimerTask; public class DifferenceTest { public static void main(String[] args) { // 獲取當前時間按照指定的格式輸出 final SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Calendar calendar = Calendar.getInstance(); System.out.println("current time is:"+ sf.format(calendar.getTime())); // 使用 timer 來執行 Timer timer = new Timer(); timer.scheduleAtFixedRate(new TimerTask() { @Override public void run() { // 模擬當前執行的過程需要 3秒 try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } // 打印最近一次執行的時間 System.out.println("scheduled exec time is :"+ sf.format(scheduledExecutionTime())); } }, calendar.getTime(), 2000); } }
控制臺輸出
current time is:2018-07-07 10:15:51 scheduled exec time is :2018-07-07 10:15:51 scheduled exec time is :2018-07-07 10:15:53 scheduled exec time is :2018-07-07 10:15:55 scheduled exec time is :2018-07-07 10:15:57 scheduled exec time is :2018-07-07 10:15:59
說明
當執行的頻率為2秒鐘,但是執行的時間為3秒的時。我們從控制臺上的輸出可以看到,執行的頻率還是為2秒,因此就會存在并發性。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/71603.html
摘要:類是一個定時任務類,該類實現了接口,而且是一個抽象類說明類是一個抽象類,由安排為一次執行或重復執行的任務。定時器實例有多種構造方法創建一個新計時器。 Timer 的定義 有且僅有一個后臺線程對多個業務進行定時定頻的調度。Timer 類可以保證多個線程可以共享單個 Timer 對象而無需進行外部同步,所以 Timer 類是線程安全的。 核心的兩個類 java.util.Timer 和 ...
時間:2017年05月24日星期三說明:本文部分內容均來自慕課網。@慕課網:http://www.imooc.com教學示例源碼:無個人學習源碼:https://github.com/zccodere/s... 第一章:課程介紹 1-1 課程介紹 什么是定時任務調度 基于給定的時間點,給定的時間間隔或者給定的執行次數自動執行的任務 在Java中的定時調度工具 Timer:小弟,能實現日常60%的定...
摘要:設置一個定時器,定時詢問服務器是否有信息,每次建立連接傳輸數據之后,鏈接會關閉。通過調用此程序提供的套接口接口與服務器端的套接口進行通信。 本文同步自我的博客園:http://hustskyking.cnblogs.com P.S: 各個平臺中就 segmentFault 寫博客體驗最好了! web通信,一個特別大的topic,涉及面也是很廣的。因最近學習了 javascript 中...
摘要:本人郵箱歡迎轉載轉載請注明網址代碼已經全部托管有需要的同學自行下載引言同步工具都講的差不多了今天我們換一下口味講一下定時任務吧理論延時后執行定時任務到達這個時間點執行定時任務延時后執行定時任務之后以為周期重復執行到達這個時間點執行定時任務之 本人郵箱: 歡迎轉載,轉載請注明網址 http://blog.csdn.net/tianshi_kcogithub: https://github...
摘要:花了將近兩個星期完成了功能,期間我編寫的能力也算是有所提升了。所以能看到這篇文章的同學都是大佬如果想看更多的原創技術文章,歡迎大家關注我的微信公眾號。可能感興趣的鏈接文章的目錄導航微信公眾號端文章的目錄導航端海量精美腦圖 前言 只有光頭才能變強 2018年8月30日,今天我辭職了。在6月25號入職,到現在也有兩個月時間了。 感受: 第一天是期待的:第一次將項目拉到本地上看的時候,代碼...
閱讀 3570·2023-04-25 14:20
閱讀 1191·2021-09-10 10:51
閱讀 1152·2019-08-30 15:53
閱讀 458·2019-08-30 15:43
閱讀 2313·2019-08-30 14:13
閱讀 2794·2019-08-30 12:45
閱讀 1204·2019-08-29 16:18
閱讀 1161·2019-08-29 16:12