摘要:代碼實(shí)例獲取當(dāng)前時(shí)間按照指定的格式輸出設(shè)置成秒之前的時(shí)間使用來(lái)執(zhí)行控制臺(tái)輸出方法總結(jié)我們可以看到實(shí)際的效果是在啟動(dòng)執(zhí)行的時(shí)候,會(huì)立馬執(zhí)行次就是為了追趕已經(jīng)過(guò)去的秒。
方法名稱(chēng) schedule() 和 scheduleAtFixedRate() 的區(qū)別
兩種情況看區(qū)別
首次計(jì)劃執(zhí)行的時(shí)間早于當(dāng)前時(shí)間
比如說(shuō):當(dāng)前時(shí)間是 11:06, 但是首次計(jì)劃執(zhí)行的時(shí)間應(yīng)該為: 11:00
任務(wù)執(zhí)行所需的時(shí)間超出任務(wù)的執(zhí)行周期間隔
比如說(shuō):我們執(zhí)行的任務(wù)的時(shí)間為 3秒,但是任務(wù)執(zhí)行的周期間隔為 2秒。
詳細(xì)分析 首次計(jì)劃的時(shí)間早于當(dāng)前時(shí)間 schedule 方法fixed-delay; 如果第一次執(zhí)行的時(shí)間被 delay 了,隨后的執(zhí)行時(shí)間按照上一次實(shí)際執(zhí)行完成的時(shí)間點(diǎn)進(jìn)行計(jì)算。
代碼實(shí)例
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) { // 獲取當(dāng)前時(shí)間按照指定的格式輸出 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())); // 設(shè)置成6秒之前的時(shí)間 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 來(lái)執(zhí)行 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); } }
控制臺(tái)輸出
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 方法總結(jié)
雖然我們是將事件提前了6秒,但是使用 schedule 還是從當(dāng)前時(shí)間開(kāi)始執(zhí)行。然后每隔兩秒執(zhí)行一次。
scheduleAtFixedRate 方法fixed-rate; 如果第一次執(zhí)行時(shí)間被 delay了,隨后的執(zhí)行時(shí)間按照上一次開(kāi)始的點(diǎn)計(jì)算,并且為了趕上進(jìn)度會(huì)多次執(zhí)行任務(wù),因?yàn)?TimerTask中的執(zhí)行需要考慮同步。
代碼實(shí)例
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) { // 獲取當(dāng)前時(shí)間按照指定的格式輸出 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())); // 設(shè)置成6秒之前的時(shí)間 calendar.add(Calendar.SECOND, -6); System.out.println("current time minus six second is :"+ sf.format(calendar.getTime())); // 使用 timer 來(lái)執(zhí)行 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); } }
控制臺(tái)輸出
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 方法總結(jié)
我們可以看到實(shí)際的效果是:在啟動(dòng)執(zhí)行的時(shí)候,會(huì)立馬執(zhí)行3次,就是為了追趕已經(jīng)過(guò)去的6秒。然后再按照設(shè)定的間隔,每?jī)擅腌妶?zhí)行一次。
任務(wù)執(zhí)行所需的時(shí)間超出任務(wù)的執(zhí)行周期間隔 schedule 方法下次執(zhí)行時(shí)間相當(dāng)于上一次實(shí)際執(zhí)行完成的時(shí)間點(diǎn),因?yàn)閳?zhí)行的時(shí)間會(huì)不斷延后。
代碼實(shí)例
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) { // 獲取當(dāng)前時(shí)間按照指定的格式輸出 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 來(lái)執(zhí)行 Timer timer = new Timer(); timer.schedule(new TimerTask() { @Override public void run() { // 模擬當(dāng)前執(zhí)行的過(guò)程需要 3秒 try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } // 打印最近一次執(zhí)行的時(shí)間 System.out.println("scheduled exec time is :"+ sf.format(scheduledExecutionTime())); } }, calendar.getTime(), 2000); } }
控制臺(tái)輸出
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
說(shuō)明
我們可以空控制臺(tái)中輸出的結(jié)果中看到:我們當(dāng)前的時(shí)間為 14:43:51,然后第一次計(jì)劃執(zhí)行的時(shí)間也為 14:43:51。但是以后每次執(zhí)行的時(shí)間都是相隔 3秒鐘,并不是我們上面設(shè)置 timerTask 的時(shí)間間隔 2秒。所以說(shuō)使用 schedule 方法,在這種情況下會(huì)不斷的延后。
scheduleAtFixedRate 方法下一次執(zhí)行時(shí)間相對(duì)于上一次開(kāi)始的時(shí)間點(diǎn),因此執(zhí)行時(shí)間一般不會(huì)延后,因此存在并發(fā)性
代碼實(shí)例
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) { // 獲取當(dāng)前時(shí)間按照指定的格式輸出 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 來(lái)執(zhí)行 Timer timer = new Timer(); timer.scheduleAtFixedRate(new TimerTask() { @Override public void run() { // 模擬當(dāng)前執(zhí)行的過(guò)程需要 3秒 try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } // 打印最近一次執(zhí)行的時(shí)間 System.out.println("scheduled exec time is :"+ sf.format(scheduledExecutionTime())); } }, calendar.getTime(), 2000); } }
控制臺(tái)輸出
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
說(shuō)明
當(dāng)執(zhí)行的頻率為2秒鐘,但是執(zhí)行的時(shí)間為3秒的時(shí)。我們從控制臺(tái)上的輸出可以看到,執(zhí)行的頻率還是為2秒,因此就會(huì)存在并發(fā)性。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/71603.html
摘要:類(lèi)是一個(gè)定時(shí)任務(wù)類(lèi),該類(lèi)實(shí)現(xiàn)了接口,而且是一個(gè)抽象類(lèi)說(shuō)明類(lèi)是一個(gè)抽象類(lèi),由安排為一次執(zhí)行或重復(fù)執(zhí)行的任務(wù)。定時(shí)器實(shí)例有多種構(gòu)造方法創(chuàng)建一個(gè)新計(jì)時(shí)器。 Timer 的定義 有且僅有一個(gè)后臺(tái)線(xiàn)程對(duì)多個(gè)業(yè)務(wù)進(jìn)行定時(shí)定頻的調(diào)度。Timer 類(lèi)可以保證多個(gè)線(xiàn)程可以共享單個(gè) Timer 對(duì)象而無(wú)需進(jìn)行外部同步,所以 Timer 類(lèi)是線(xiàn)程安全的。 核心的兩個(gè)類(lèi) java.util.Timer 和 ...
時(shí)間:2017年05月24日星期三說(shuō)明:本文部分內(nèi)容均來(lái)自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com教學(xué)示例源碼:無(wú)個(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%的定...
摘要:設(shè)置一個(gè)定時(shí)器,定時(shí)詢(xún)問(wèn)服務(wù)器是否有信息,每次建立連接傳輸數(shù)據(jù)之后,鏈接會(huì)關(guān)閉。通過(guò)調(diào)用此程序提供的套接口接口與服務(wù)器端的套接口進(jìn)行通信。 本文同步自我的博客園:http://hustskyking.cnblogs.com P.S: 各個(gè)平臺(tái)中就 segmentFault 寫(xiě)博客體驗(yàn)最好了! web通信,一個(gè)特別大的topic,涉及面也是很廣的。因最近學(xué)習(xí)了 javascript 中...
摘要:本人郵箱歡迎轉(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...
摘要:花了將近兩個(gè)星期完成了功能,期間我編寫(xiě)的能力也算是有所提升了。所以能看到這篇文章的同學(xué)都是大佬如果想看更多的原創(chuàng)技術(shù)文章,歡迎大家關(guān)注我的微信公眾號(hào)。可能感興趣的鏈接文章的目錄導(dǎo)航微信公眾號(hào)端文章的目錄導(dǎo)航端海量精美腦圖 前言 只有光頭才能變強(qiáng) 2018年8月30日,今天我辭職了。在6月25號(hào)入職,到現(xiàn)在也有兩個(gè)月時(shí)間了。 感受: 第一天是期待的:第一次將項(xiàng)目拉到本地上看的時(shí)候,代碼...
閱讀 3565·2023-04-25 14:20
閱讀 1179·2021-09-10 10:51
閱讀 1146·2019-08-30 15:53
閱讀 452·2019-08-30 15:43
閱讀 2307·2019-08-30 14:13
閱讀 2785·2019-08-30 12:45
閱讀 1199·2019-08-29 16:18
閱讀 1155·2019-08-29 16:12