當(dāng)前位置:
首頁(yè) >
Timer的schedule和scheduleAtFixedRate方法的区别解析
發(fā)布時(shí)間:2025/4/16
35
豆豆
生活随笔
收集整理的這篇文章主要介紹了
Timer的schedule和scheduleAtFixedRate方法的区别解析
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
在java中,Timer類(lèi)主要用于
定時(shí)性、周期性任務(wù)的觸發(fā),這個(gè)類(lèi)中有兩個(gè)方法比較難理解,那就是schedule和scheduleAtFixedRate方法,在這里就用實(shí)例分析一下
(1)schedule方法:“fixed-delay”;如果第一次執(zhí)行時(shí)間被delay了,隨后的執(zhí)行時(shí)間 按照 上一次 實(shí)際執(zhí)行完成的時(shí)間點(diǎn)進(jìn)行計(jì)算
(2)scheduleAtFixedRate方法:“fixed-rate”;如果第一次執(zhí)行時(shí)間被delay了,隨后的執(zhí)行時(shí)間 按照 上一次開(kāi)始的 時(shí)間點(diǎn)進(jìn)行計(jì)算,并且為了”catch up”會(huì)多次執(zhí)行任務(wù),TimerTask中的執(zhí)行體 需要考慮同步
[c-sharp] view plaincopySimpleDateFormat?dateFormatter?=?new?SimpleDateFormat("yyyy/MM/dd?HH:mm:ss");?? Date?startDate?=?dateFormatter.parse("2010/11/26?00:20:00");?? Timer?timer?=?new?Timer();?? timer.scheduleAtFixedRate(new?TimerTask(){?? ???public?void?run()?? ???{?? ???????System.out.println("execute?task!"?+?this.scheduledExecutionTime());?? ???}?? },startDate,3*60*1000);??
以上的代碼,表示在2010-11-26 00:20:00秒開(kāi)始執(zhí)行,每3分鐘執(zhí)行一次
假設(shè)在2010/11/26 00:27:00執(zhí)行
以上會(huì)打印出3次
execute task!?? 00:20
execute task!?? 00:23??? catch up
execute task!?? 00:26??? catch up
下一次執(zhí)行時(shí)間是00:29,相對(duì)于00:26
當(dāng)換成schedule方法時(shí),在2010/11/26 00:27:00執(zhí)行
會(huì)打印出1次
execute task!?? 00:20?? 無(wú)catch up
下一次執(zhí)行時(shí)間為00:30,相對(duì)于00:27
以上考慮的都是在你設(shè)定的timer開(kāi)始時(shí)間后,程序才被執(zhí)行
當(dāng)執(zhí)行任務(wù)的時(shí)間大于周期間隔時(shí),會(huì)發(fā)生什么呢?
(1)schedule方法:下一次執(zhí)行時(shí)間相對(duì)于 上一次 實(shí)際執(zhí)行完成的時(shí)間點(diǎn) ,因此執(zhí)行時(shí)間會(huì)不斷延后
(2)scheduleAtFixedRate方法:下一次執(zhí)行時(shí)間相對(duì)于 上一次開(kāi)始的 時(shí)間點(diǎn),因此執(zhí)行時(shí)間不會(huì)延后, 存在并發(fā)性
以下例程序來(lái)測(cè)試上述結(jié)論,TimerTask需要執(zhí)行6秒鐘,但是間隔周期為5秒鐘
[java] view plaincopypackage?test;?? import?java.text.ParseException;?? import?java.text.SimpleDateFormat;?? import?java.util.Date;?? import?java.util.Timer;?? import?java.util.TimerTask;?? public?class?Test?{?? ?????? ????public?static?void?main(String[]?args)?throws?ParseException?{?? ????????SimpleDateFormat?dateFormatter?=?new?SimpleDateFormat("yyyy/MM/dd?HH:mm:ss");?? ????????Date?startDate?=?dateFormatter.parse("2010/11/28?01:06:00");?? ????????Timer?timer?=?new?Timer();?? ????????timer.schedule(new?TimerTask(){?? ???????????public?void?run()?{?? ???????????????try?{?? ???????????????????Thread.sleep(6000);?? ???????????????}?catch?(InterruptedException?e)?{?? ???????????????????e.printStackTrace();?? ???????????????}?? ???????????????System.out.println("execute?task!"+?this.scheduledExecutionTime());?? ???????????}?? ????????},startDate,?5?*?1000);?? ????}?? ?????? }??
schedule方法的執(zhí)行結(jié)果如下:
execute task!1290877560001
execute task!1290877566001
execute task!1290877572001
execute task!1290877578001
execute task!1290877584001
execute task!1290877590001
execute task!1290877596001
execute task!1290877602001
execute task!1290877608001
execute task!1290877614001
execute task!1290877620001
execute task!1290877626001
execute task!1290877632001
execute task!1290877638001
可以看出,間隔時(shí)間都為6秒,因此, 下一次的執(zhí)行時(shí)間點(diǎn)=上一次程序執(zhí)行完成的時(shí)間點(diǎn)+間隔時(shí)間
當(dāng)換成scheduleAtFixedRate方法的執(zhí)行結(jié)果如下:
execute task!1290877860000
execute task!1290877865000
execute task!1290877870000
execute task!1290877875000
execute task!1290877880000
execute task!1290877885000
execute task!1290877890000
execute task!1290877895000
execute task!1290877900000
execute task!1290877905000
execute task!1290877910000
execute task!1290877915000
execute task!1290877920000
execute task!1290877925000
execute task!1290877930000
可以看出,間隔時(shí)間都為5秒,因此, 下一次的執(zhí)行時(shí)間點(diǎn)=上一次程序開(kāi)始執(zhí)行的時(shí)間點(diǎn)+間隔時(shí)間;并且因?yàn)榍耙粋€(gè)任務(wù)要執(zhí)行6秒,而當(dāng)前任務(wù)已經(jīng)開(kāi)始執(zhí)行了,因此兩個(gè)任務(wù)間存在重疊,需要考慮線程同步
(1)schedule方法:“fixed-delay”;如果第一次執(zhí)行時(shí)間被delay了,隨后的執(zhí)行時(shí)間 按照 上一次 實(shí)際執(zhí)行完成的時(shí)間點(diǎn)進(jìn)行計(jì)算
(2)scheduleAtFixedRate方法:“fixed-rate”;如果第一次執(zhí)行時(shí)間被delay了,隨后的執(zhí)行時(shí)間 按照 上一次開(kāi)始的 時(shí)間點(diǎn)進(jìn)行計(jì)算,并且為了”catch up”會(huì)多次執(zhí)行任務(wù),TimerTask中的執(zhí)行體 需要考慮同步
[c-sharp] view plaincopy
以上的代碼,表示在2010-11-26 00:20:00秒開(kāi)始執(zhí)行,每3分鐘執(zhí)行一次
假設(shè)在2010/11/26 00:27:00執(zhí)行
以上會(huì)打印出3次
execute task!?? 00:20
execute task!?? 00:23??? catch up
execute task!?? 00:26??? catch up
下一次執(zhí)行時(shí)間是00:29,相對(duì)于00:26
當(dāng)換成schedule方法時(shí),在2010/11/26 00:27:00執(zhí)行
會(huì)打印出1次
execute task!?? 00:20?? 無(wú)catch up
下一次執(zhí)行時(shí)間為00:30,相對(duì)于00:27
以上考慮的都是在你設(shè)定的timer開(kāi)始時(shí)間后,程序才被執(zhí)行
當(dāng)執(zhí)行任務(wù)的時(shí)間大于周期間隔時(shí),會(huì)發(fā)生什么呢?
(1)schedule方法:下一次執(zhí)行時(shí)間相對(duì)于 上一次 實(shí)際執(zhí)行完成的時(shí)間點(diǎn) ,因此執(zhí)行時(shí)間會(huì)不斷延后
(2)scheduleAtFixedRate方法:下一次執(zhí)行時(shí)間相對(duì)于 上一次開(kāi)始的 時(shí)間點(diǎn),因此執(zhí)行時(shí)間不會(huì)延后, 存在并發(fā)性
以下例程序來(lái)測(cè)試上述結(jié)論,TimerTask需要執(zhí)行6秒鐘,但是間隔周期為5秒鐘
[java] view plaincopy
schedule方法的執(zhí)行結(jié)果如下:
execute task!1290877560001
execute task!1290877566001
execute task!1290877572001
execute task!1290877578001
execute task!1290877584001
execute task!1290877590001
execute task!1290877596001
execute task!1290877602001
execute task!1290877608001
execute task!1290877614001
execute task!1290877620001
execute task!1290877626001
execute task!1290877632001
execute task!1290877638001
可以看出,間隔時(shí)間都為6秒,因此, 下一次的執(zhí)行時(shí)間點(diǎn)=上一次程序執(zhí)行完成的時(shí)間點(diǎn)+間隔時(shí)間
當(dāng)換成scheduleAtFixedRate方法的執(zhí)行結(jié)果如下:
execute task!1290877860000
execute task!1290877865000
execute task!1290877870000
execute task!1290877875000
execute task!1290877880000
execute task!1290877885000
execute task!1290877890000
execute task!1290877895000
execute task!1290877900000
execute task!1290877905000
execute task!1290877910000
execute task!1290877915000
execute task!1290877920000
execute task!1290877925000
execute task!1290877930000
可以看出,間隔時(shí)間都為5秒,因此, 下一次的執(zhí)行時(shí)間點(diǎn)=上一次程序開(kāi)始執(zhí)行的時(shí)間點(diǎn)+間隔時(shí)間;并且因?yàn)榍耙粋€(gè)任務(wù)要執(zhí)行6秒,而當(dāng)前任務(wù)已經(jīng)開(kāi)始執(zhí)行了,因此兩個(gè)任務(wù)間存在重疊,需要考慮線程同步
總結(jié)
以上是生活随笔為你收集整理的Timer的schedule和scheduleAtFixedRate方法的区别解析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: java paintComponent的
- 下一篇: js实现textarea根据内容大小自适