-
Timer 的缺陷:
???? 1 并發(fā)操作時的缺陷,這是因為 Timer 的后臺只有一個執(zhí)行線程導致的。
???? 2 當任務拋出異常時的缺陷。如果 TimeTask 拋出 RuntimeException,Timer 會停止所有任務的執(zhí)行。
根據(jù)缺陷,我們可以得出 Timer 的使用禁區(qū)。
????1 對時效性要求較高的多任務并發(fā)作業(yè),雖然 Timer 支持多任務執(zhí)行,但那都是串行執(zhí)行的。
????2 對復雜的任務的調(diào)度,因為在復雜的任務中可能會出現(xiàn)異常,而Timer 中一旦出現(xiàn)異常,則停止執(zhí)行。
查看全部 -
schedule與scheduleAtFixedRate的區(qū)別
情況1:計劃執(zhí)行的時間早于當前的時間。
schedule方法:當調(diào)用該方法時,調(diào)用定時任務的時間以當前時間為準,可以通過調(diào)用scheduleExecutionTime查看時間的基準。(設置了00:00開始執(zhí)行,每兩秒鐘執(zhí)行一次,但是任務開始的時候是00:06,那么就會執(zhí)行00:06? 00:08 )
scheduleAtFixedRate():調(diào)用該方法時,以方法中傳入的時間為準,例如,傳入的時間為12:00,那么scheduleExecutionTime()的時間就是12:00,如果當前時間晚于傳入的時間,那么就會進行追趕多次執(zhí)行該方法。注意:它存在并發(fā)性,例如圖片中當前時間為15:05:31,但是調(diào)用定時任務的時間為15:05:25,那么它就會在同一時間執(zhí)行三次該方法。 25 27 29 31,25 27 29是一瞬間執(zhí)行
情況2:任務執(zhí)行所需時間超出任務執(zhí)行的時間間隔。??
schedule方法:比如規(guī)定2s執(zhí)行一次,但是執(zhí)行需要3s,那么schedule(timeTask,calender.getTime(),2000),就會在設置的calender中執(zhí)行一次,以及3s后執(zhí)行一次
scheduleAtFixRate():?比如規(guī)定2s執(zhí)行一次,但是執(zhí)行需要3s,那么schedule(timeTask,calender.getTime(),2000),就會在設置的calender中執(zhí)行一次,以及2s后執(zhí)行一次,存在并發(fā)性
查看全部 -
TimerTask的cancel()函數(shù)的作用:取消當前TimerTask里的任務
TimerTask的scheduleExecutionTime()作用:返回此任務最近實際執(zhí)行的已安排執(zhí)行的時間,返回值:最近發(fā)生此任務執(zhí)行安排的時間,為long型
Timer的cancel()函數(shù)的作用:終止此計時器,丟棄所有當前已安排的任務
Timer的purge()函數(shù)的作用:從此計時器的任務隊列中移除所有已取消的任務。返回值:從隊列中移除的任務數(shù)。查看全部 -
Timer的schedule方法的四種用法:
1、schedule(TimerTask task,Date time):在時間等于time或超過time執(zhí)行且執(zhí)行一次task(task業(yè)務線程,time時間)。在time或超過time的時候執(zhí)行一次,且只執(zhí)行一次
2、schedule(TimerTask task,Date time,long period):前兩個參數(shù)和1一樣,這里第三個參數(shù)表示每隔多長時間該任務調(diào)度線程調(diào)用業(yè)務線程。在time的時候執(zhí)行一次,之后每間隔period就會執(zhí)行一次
3、schedual(TimerTask task,long delay):延遲當前時間多少秒之后執(zhí)行該定時任務,并且僅執(zhí)行一次。
4、schedual(TimerTask task,long delay,long?period):延遲當前時間delay秒之后執(zhí)行定時任務,并且每隔period執(zhí)行一次定時任務。
Timer的scheduleAtFixedRate的兩種用法:
1、scheduleAtFixedRated(TimerTask?task,Date?date,long?period):到date指定時間每隔period執(zhí)行一次定時任務task。
2、scheduleAtFixedRated(TimerTask?task,long?delay,long?period):延遲當前時間delay毫秒后每隔period時間執(zhí)行一次定時任務。
查看全部 -
TimerThread是后臺執(zhí)行的線程;TimerTask對應的是業(yè)務線程,run()中涵蓋了業(yè)務的邏輯。TimerThread通過定期調(diào)用隊列里的TimerTask的run()方法,來實現(xiàn)對任務的定時定頻率的調(diào)度。我們只需要關注Timer和TimerTask。TimerThread和TaskQueue都是透明的。查看全部 -
定時任務調(diào)度:基于給定的時間點,給定的時間間隔,給定的執(zhí)行次數(shù)自動執(zhí)行的任務。Java中的定時任務1、Timer2、QuartzTimer和Quartz的區(qū)別:1、Timer由jdk提供,調(diào)用簡單,不要需要導入jar包。而Quartz需要導入jar包,不是jdk自帶。2、Quartz的功能比Timer的功能強大完善。3、Timer后臺執(zhí)行一個線程來完成定時任務,Quartz可以在后臺執(zhí)行多個線程來完成定時任務。
查看全部 -
TimerThread是后臺執(zhí)行的線程;TimerTask對應的是業(yè)務線程,run()中涵蓋了業(yè)務的邏輯。
TimerThread通過定期調(diào)用隊列里的TimerTask的run()方法,來實現(xiàn)對任務的定時定頻率的調(diào)度。
我們只需要關注Timer和TimerTask。TimerThread和TaskQueue都是透明的。
查看全部 -
Timer的缺陷
1、管理并發(fā)任務的缺陷:Timer有且僅有一條后臺的線程,對定時任務定時定頻率的調(diào)用,對于多任務來說并不支持任務與任務之間的并發(fā)。
例如:
2、任務拋出異常的缺陷:它對runtimeexception的支持不是很好。
舉例:
查看全部 -
schedule與scheduleAtFixedRate的區(qū)別
情況1:計劃執(zhí)行的時間早于當前的時間。
schedule方法:當調(diào)用該方法時,調(diào)用定時任務的時間以當前時間為準,可以通過調(diào)用scheduleExecutionTime查看時間的基準。
scheduleAtFixedRate():調(diào)用該方法時,以方法中傳入的時間為準,例如,傳入的時間為12:00,那么scheduleExecutionTime()的時間就是12:00,如果當前時間晚于傳入的時間,那么就會進行追趕多次執(zhí)行該方法。注意:它存在并發(fā)性,例如圖片中當前時間為15:05:31,但是調(diào)用定時任務的時間為15:05:25,那么它就會在同一時間執(zhí)行三次該方法。
情況2:任務執(zhí)行所需時間超出任務執(zhí)行的時間間隔。
schedule()
scheduleAtFixedTime()
查看全部 -
TimerTask的cancel()、scheduledExecutionTime()
cancel():取消當前TimerTask里的任務。
scheduledExecutionTime():返回最近一次執(zhí)行該定時任務的時間。
Timer的cancel()、purge()
cancel():Timer下的cancel()表示結束當前Timer的所有定時任務。
purge():表示從此Timer的定時任務隊列中移除所有已經(jīng)取消的定時任務,并且返回移除的個數(shù)。
查看全部 -
Timer的schedule方法的四種用法:
1、schedule(TimerTask task,Date time):在時間等于time或超過time執(zhí)行且執(zhí)行一次task(task業(yè)務線程,time時間)。
2、schedule(TimerTask task,Date time,long period):前兩個參數(shù)和1一樣,這里第三個參數(shù)表示每隔多長時間該任務調(diào)度線程調(diào)用業(yè)務線程。
3、schedual(TimerTask task,long delay):延遲當前時間多少秒之后執(zhí)行該定時任務,并且僅執(zhí)行一次。
4、schedual(TimerTask task,long delay,long?period):延遲當前時間delay秒之后執(zhí)行定時任務,并且每隔period執(zhí)行一次定時任務。
Timer的scheduleAtFixedRate的兩種用法:
1、scheduleAtFixedRated(TimerTask?task,Date?date,long?period):到date指定時間每隔period執(zhí)行一次定時任務task。
2、scheduleAtFixedRated(TimerTask?task,long?delay,long?period):延遲當前時間delay毫秒后每隔period時間執(zhí)行一次定時任務。
查看全部 -
Timer定義:java.util.Timer包,有且僅有一個后臺線程對多個業(yè)務線程進行定時定頻率的調(diào)度。
Timer(調(diào)度線程)——》TimerTask(業(yè)務線程)
Timer工具類詳解:如圖,這里可以理解TimerThread是后臺定時調(diào)用的線程,而TimerTask可以理解為業(yè)務線程,業(yè)務線程要在run方法中進行實現(xiàn)。
舉例:如圖,業(yè)務線程的實現(xiàn)需要在繼承TimerTask的run方法中實現(xiàn),調(diào)度業(yè)務線程需要通過Timer實例的schedule方法,參數(shù)1表示業(yè)務線程所在類實例,參數(shù)2表示起初隔多長時間執(zhí)行該調(diào)度線程,參數(shù)3表示每個多長時間間隔執(zhí)行業(yè)務線程。
查看全部 -
定時任務調(diào)度:基于給定的時間點,給定的時間間隔,給定的執(zhí)行次數(shù)自動執(zhí)行的任務。
Java中的定時任務
1、Timer
2、Quartz
Timer和Quartz的區(qū)別:
1、Timer由jdk提供,調(diào)用簡單,不要需要導入jar包。而Quartz需要導入jar包,不是jdk自帶。
2、Quartz的功能比Timer的功能強大完善。
3、Timer后臺執(zhí)行一個線程來完成定時任務,Quartz可以在后臺執(zhí)行多個線程來完成定時任務。
查看全部 -
scheduleAtFixedRate方法
“fixed-rate”;如果第一次執(zhí)行時間被delay了,隨后的執(zhí)行時間按照上一次開始的時間點進行計算,并且為了趕上進度會多次執(zhí)行任務,因此TimerTask中的執(zhí)行體需要考慮
查看全部 -
schedule與scheduleAtFixedRate的區(qū)別
從兩種情況看區(qū)別
1、首次計劃執(zhí)行的時間早于當前的時間(比如:當前時間是雙十一的00:00:06而我們計劃執(zhí)行的時間是雙十一的00:00:00)
2、任務執(zhí)行所需的時間超出任務的執(zhí)行周期間隔(比如:這個任務需要每隔兩秒執(zhí)行一次,但是單次這個任務的執(zhí)行時間就是3秒)
查看全部 -
Timer的定義
有且僅有一個后臺線程 對 多個業(yè)務線程 進行 定時定頻率 的調(diào)度
查看全部 -
前言:
首先我們先明確一下什么是定時任務調(diào)度?
基于給定的時間點,給定的時間間隔或者給定的執(zhí)行次數(shù)自動執(zhí)行的任務。
Java中定時任務調(diào)動工具有倆:Timer 、Quartz
區(qū)別:
? ? 出身不同:Timer由jdk直接提供,不需jar包支持;Quartz需引入jar包。
????能力不同:Timer簡單定時任務;Quartz時間控制功能更強大。
????底層機制:Timer只有一個后臺線程執(zhí)行;Quartz是多線程執(zhí)行任務。
一.Timer簡介:
? ? 讓我們看下官方文檔api(JDK1.8)
可能有的小伙伴英語水平不太好,那讓我們看下中文版吧:
?
那么我們可以歸納Timer的定義:有且僅有一個后臺線程對多個業(yè)務線程進行定時定頻率的調(diào)度
主要構件:
?
Timer工具類詳解:
二.Timer實戰(zhàn)
1.簡單實戰(zhàn)
1)定時任務類
package?com.leo.timer;import?java.util.TimerTask;public?class?MyTimerTask?extends?TimerTask?{????private?String?name;????public?MyTimerTask(String?inputName){ ????????name=inputName; ????}????@Override ????public?void?run()?{????????//打印當前name的內(nèi)容 ????????System.out.println("Current?exec?name?is"+name); ????}????public?String?getName()?{????????return?name; ????}????public?void?setName(String?name)?{????????this.name?=?name; ????} }
2)Timer啟動
package?com.leo.timer;import?java.util.Timer;public?class?MyTimer?{????public??static?void??main(String[]?args){????????//1.創(chuàng)建一個timer實例 ????????Timer?timer=new?Timer();????????//2.創(chuàng)建一個MyTimerTask實例 ????????MyTimerTask?myTimerTask=new?MyTimerTask("No.1");????????//3.通過timer定時頻率調(diào)用myTImerTask的業(yè)務邏輯 ????????//?既第一次執(zhí)行是在當前時間的兩秒之后,之后每隔一秒鐘執(zhí)行一次 ????????timer.schedule(myTimerTask,2000L,1000L); ????} }
控制臺打印顯示:
?
2.Timer的定時調(diào)度函數(shù)
1)schedule的四種用法
? ? 1.schedule(task,time)
????????作用:在時間等于或超過time的時候執(zhí)行且僅執(zhí)行一次task
? ? 2.schedule(task,time,period)
????????參數(shù):????task-所要安排的任務
????????????????????? time-首次執(zhí)行任務的時間
????????????????????? period-執(zhí)行一次task的時間間隔,單位是毫秒
? ? 3.schedule(task,delay)
????????參數(shù):????task-所要安排的任務
????????????????????? delay-執(zhí)行任務前的延遲時間,單位是毫秒
?????? ?作用:??? 等待delay毫秒后執(zhí)行且僅執(zhí)行一次task
? ? 4.schedule(task,delay,period)
????????參數(shù):????task-所要安排的任務
????????????????????? delay-執(zhí)行任務前的延遲時間,單位是毫秒
????????????????????? period-執(zhí)行一次task的時間間隔,單位是毫秒
?????? ?作用:??? 等待delay毫秒后執(zhí)行且僅執(zhí)行一次task,之后每隔period毫秒重復執(zhí)行一次task
具體代碼如下:
????定時任務類:
????
package?com.leo.timer;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()?{????????//打印當前name的內(nèi)容 ????????System.out.println("Current?exec?name?is?"+name);????????//以yyyy-MM-dd?HH:mm:ss的格式打印當前執(zhí)行時間 ????????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())); ????}????public?String?getName()?{????????return?name; ????}????public?void?setName(String?name)?{????????this.name?=?name; ????} }
? ? 四中啟動類:
????????
package?com.leo.timer;import?java.text.SimpleDateFormat;import?java.util.Calendar;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è)務邏輯 ????????//?既第一次執(zhí)行是在當前時間的兩秒之后,之后每隔一秒鐘執(zhí)行一次 ????????//timer.schedule(myTimerTask,2000L,1000L); ????????/** ?????????*?獲取當前時間,并設置成距離當前時間三秒之后的時間 ?????????*?如果當前時間是2017-10-21?23:59:57 ?????????*?則設置后的時間則為2017-10-22?00:00:00 ?????????*/ ????????Calendar?calendar=Calendar.getInstance(); ????????SimpleDateFormat?sf=new?SimpleDateFormat("yyyy-MM-dd?HH:mm:ss"); ????????System.out.println(sf.format(calendar.getTime())); ????????calendar.add(Calendar.SECOND,3);????????/** ?????????*?1.??schedule(task,time) ?????????*??????在時間等于或超過time的時候執(zhí)行且僅執(zhí)行一次task ?????????*??????如在2017-10-22?00:00:00?執(zhí)行一次task:打印任務的名字 ?????????*/ ????????//myTimerTask.setName("schedule1"); ????????//timer.schedule(myTimerTask,calendar.getTime()); ????????/** ?????????*?2.?schedule(task,time,period) ?????????*??????時間等于或超過time時首次執(zhí)行task ?????????*??????之后每隔period毫秒重復執(zhí)行一次task ?????????*??????如在2017-10-22?00:00:00?第一次執(zhí)行task:打印任務的名字 ?????????*??????之后每隔兩秒執(zhí)行一次task ?????????*/ ????????//myTimerTask.setName("schedule2"); ????????//timer.schedule(myTimerTask,calendar.getTime(),2000); ????????/** ?????????*?3.?schedule(task,delay) ?????????*??????等待delay毫秒后執(zhí)行且僅執(zhí)行一次task ?????????*??????如現(xiàn)在是2017-10-22?00:00:00 ?????????*??????則在2017-10-22?00:00:01執(zhí)行一次task::打印任務的名字 ?????????*/ ????????//myTimerTask.setName("schedule3"); ????????//timer.schedule(myTimerTask,1000); ????????/** ?????????*?4.??schedule(task,delay,period) ?????????*??????等待delay毫秒后首次執(zhí)行task ?????????*??????如現(xiàn)在是2017-10-22?00:00:00 ?????????*??????則在2017-10-22?00:00:01執(zhí)行一次task::打印任務的名字 ?????????*??????之后每隔兩秒執(zhí)行一次task ?????????*/ ?????????myTimerTask.setName("schedule4"); ?????????timer.schedule(myTimerTask,calendar.getTime(),2000); ????} }
2)scheduleAtFixedRate的四種用法? ??????? ?
? ? 1.scheduleAtFixedRate(task,time,period)
????????參數(shù):????task-所要安排的任務
????????????? ????????time-首次執(zhí)行任務的時間
????????????? ????????period-執(zhí)行一次task的時間間隔,單位是毫秒? ??
???????作用:? ??時間等于或超過time時首次執(zhí)行task,之后每隔period毫秒重復執(zhí)行一次task(和schedule的第二種用法是一樣的)
? ? 2.scheduleAtFixedRate(task,delay,period)
????? ? 參數(shù):????task-所要安排的任務
????????????????????? delay-執(zhí)行任務前的延遲時間,單位是毫秒
????????????????????? period-執(zhí)行一次task的時間間隔,單位是毫秒
?????? ?作用:??? 等待delay毫秒后執(zhí)行且僅執(zhí)行一次task,之后每隔period毫秒重復執(zhí)行一次task(和schedule的第四種用法是一樣的)
代碼:
?//----------------scheduleAtFixedRate的用法------------------------------- ????????/** ?????????*?1?.?scheduleAtFixedRate(task,time,period) ?????????*??????時間等于或超過time時首次執(zhí)行task ?????????*??????之后每隔period毫秒重復執(zhí)行一次task ?????????*??????如在2017-10-22?00:00:00?第一次執(zhí)行task:打印任務的名字 ?????????*??????之后每隔兩秒執(zhí)行一次task ?????????*/ ????????//myTimerTask.setName("scheduleAtFixedRate1"); ????????//timer.scheduleAtFixedRate(myTimerTask,calendar.getTime(),2000); ????????/** ?????????*?2.??scheduleAtFixedRate(task,delay,period) ?????????*??????等待delay毫秒后首次執(zhí)行task ?????????*??????如現(xiàn)在是2017-10-22?00:00:00 ?????????*??????則在2017-10-22?00:00:01執(zhí)行一次task::打印任務的名字 ?????????*??????之后每隔兩秒執(zhí)行一次task ?????????*/ ????????myTimerTask.setName("scheduleAtFixedRate2"); ????????timer.scheduleAtFixedRate(myTimerTask,3000,2000);
?
我們先來看Timer的其他重要函數(shù),下一標題再具體講解schedule和schedulAtFixedRate二者的不同
3)其他重要函數(shù)
? ? 1.TimerTask的cancel(),scheduledExecutionTime() :
????? ? cancel:
????????????作用:取消當前TimerTask里的任務
????????
????@Override ????public?void?run()?{????????if?(count<3){????????????//打印當前name的內(nèi)容 ????????????System.out.println("Current?exec?name?is?"+name);????????????//以yyyy-MM-dd?HH:mm:ss的格式打印當前執(zhí)行時間 ????????????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())); ????????????count++; ????????}else?{ ????????????cancel(); ????????????System.out.println("Task?cancel"); ????????} ????}
????? ? scheduledExecutionTime():
????????? ? 作用:返回此任務最近實際執(zhí)行的已安排執(zhí)行的時間
?
????2.Timer的cancel() , perge()?:
????? ??cancel():
????????? ? 作用:終止此計時器,丟棄所有當前已安排的任務
????????
????? ? purge():
????????? ? 作用:從此計時器的任務隊列中移除所要已取消的任務
????????? ? 返回值:從隊列中移除的任務數(shù)
3.schedule和scheduleAtFixeRate的區(qū)別
1)首次計劃執(zhí)行的時間早于當前的時間
? ? 1.schedule方法:
????????????"fixed-delay"如果第一次執(zhí)行時間被delay了,隨后的執(zhí)行時間按上一次實際執(zhí)行完成的時間點進行計算
console:
????2.scheduleAtFixedRate方法:
????????????"fixed-rate"如果第一次執(zhí)行時間被delay了,隨后的執(zhí)行時間按上一次實際執(zhí)行完成的時間點進行計算,并且為了趕上進度會多次執(zhí)行任務,因此TimerTask中的執(zhí)行體需要考慮同步
console:
?
?2)任務執(zhí)行所需時間超出任務的執(zhí)行周期間隔
? ? 1.schedule方法:
????????????下一次執(zhí)行時間相對于上一次實際執(zhí)行完成的時間點,因此執(zhí)行時間會不斷延后
console:
????2.scheduleAtFixedRate方法:
????????????下一次執(zhí)行時間相對于上一次開始的時間點,因此執(zhí)行的時間不會延后,因此存在并發(fā)性
console:
4.Timer的缺陷:
1)管理并發(fā)任務的缺陷
? ? Timer有且僅有一個線程去執(zhí)行定時任務,如果存在多個定時任務,且任務時間過長,會導致執(zhí)行效果與預期不符
console:
同樣scheduleAtFixedRate也不能解決并發(fā)問題:
2)當任務拋出異常時的缺陷
? ? 如果TimerTask拋出RuntimeException,Timer會停止所有任務的執(zhí)行
三.Timer的使用禁區(qū):
1.對時效性要求較高的多任務并發(fā)作業(yè)
2.對復雜的任務的調(diào)度
如果想要滿足以上功能,需用到Quartz
查看全部
舉報