Timer的schedule和scheduleAtFixedRate方法的区别解析
生活随笔
收集整理的這篇文章主要介紹了
Timer的schedule和scheduleAtFixedRate方法的区别解析
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在java中,Timer類主要用于
定時性、周期性任務的觸發,這個類中有兩個方法比較難理解,那就是schedule和scheduleAtFixedRate方法,在這里就用實例分析一下
(1)schedule方法:“fixed-delay”;如果第一次執行時間被delay了,隨后的執行時間 按照 上一次 實際執行完成的時間點進行計算
(2)scheduleAtFixedRate方法:“fixed-rate”;如果第一次執行時間被delay了,隨后的執行時間 按照 上一次開始的 時間點進行計算,并且為了”catch up”會多次執行任務,TimerTask中的執行體 需要考慮同步
[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秒開始執行,每3分鐘執行一次
假設在2010/11/26 00:27:00執行
以上會打印出3次
execute task!?? 00:20
execute task!?? 00:23??? catch up
execute task!?? 00:26??? catch up
下一次執行時間是00:29,相對于00:26
當換成schedule方法時,在2010/11/26 00:27:00執行
會打印出1次
execute task!?? 00:20?? 無catch up
下一次執行時間為00:30,相對于00:27
以上考慮的都是在你設定的timer開始時間后,程序才被執行
當執行任務的時間大于周期間隔時,會發生什么呢?
(1)schedule方法:下一次執行時間相對于 上一次 實際執行完成的時間點 ,因此執行時間會不斷延后
(2)scheduleAtFixedRate方法:下一次執行時間相對于 上一次開始的 時間點,因此執行時間不會延后, 存在并發性
以下例程序來測試上述結論,TimerTask需要執行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方法的執行結果如下:
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
可以看出,間隔時間都為6秒,因此, 下一次的執行時間點=上一次程序執行完成的時間點+間隔時間
當換成scheduleAtFixedRate方法的執行結果如下:
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
可以看出,間隔時間都為5秒,因此, 下一次的執行時間點=上一次程序開始執行的時間點+間隔時間;并且因為前一個任務要執行6秒,而當前任務已經開始執行了,因此兩個任務間存在重疊,需要考慮線程同步
(1)schedule方法:“fixed-delay”;如果第一次執行時間被delay了,隨后的執行時間 按照 上一次 實際執行完成的時間點進行計算
(2)scheduleAtFixedRate方法:“fixed-rate”;如果第一次執行時間被delay了,隨后的執行時間 按照 上一次開始的 時間點進行計算,并且為了”catch up”會多次執行任務,TimerTask中的執行體 需要考慮同步
[c-sharp] view plaincopy
以上的代碼,表示在2010-11-26 00:20:00秒開始執行,每3分鐘執行一次
假設在2010/11/26 00:27:00執行
以上會打印出3次
execute task!?? 00:20
execute task!?? 00:23??? catch up
execute task!?? 00:26??? catch up
下一次執行時間是00:29,相對于00:26
當換成schedule方法時,在2010/11/26 00:27:00執行
會打印出1次
execute task!?? 00:20?? 無catch up
下一次執行時間為00:30,相對于00:27
以上考慮的都是在你設定的timer開始時間后,程序才被執行
當執行任務的時間大于周期間隔時,會發生什么呢?
(1)schedule方法:下一次執行時間相對于 上一次 實際執行完成的時間點 ,因此執行時間會不斷延后
(2)scheduleAtFixedRate方法:下一次執行時間相對于 上一次開始的 時間點,因此執行時間不會延后, 存在并發性
以下例程序來測試上述結論,TimerTask需要執行6秒鐘,但是間隔周期為5秒鐘
[java] view plaincopy
schedule方法的執行結果如下:
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
可以看出,間隔時間都為6秒,因此, 下一次的執行時間點=上一次程序執行完成的時間點+間隔時間
當換成scheduleAtFixedRate方法的執行結果如下:
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
可以看出,間隔時間都為5秒,因此, 下一次的執行時間點=上一次程序開始執行的時間點+間隔時間;并且因為前一個任務要執行6秒,而當前任務已經開始執行了,因此兩個任務間存在重疊,需要考慮線程同步
總結
以上是生活随笔為你收集整理的Timer的schedule和scheduleAtFixedRate方法的区别解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java paintComponent的
- 下一篇: js实现textarea根据内容大小自适