Java并发编程—schedule方法和scheduleAtFixedRate方法的区别
原文作者:一葉丿清風
原文地址:schedule方法和scheduleAtFixedRate方法的區別
schedule方法和scheduleAtFixedRate方法都可以實現任務的延時和不延時執行且都會按順序執行,因此不需要考慮非線程安全的情況。它們的主要區別只在于有沒有追趕特性。具體如下:
舉個例子:暑假到了老師給schedule和scheduleAtFixedRate兩個同學布置作業。老師要求學生暑假每天寫2頁,30天后完成作業。這兩個學生每天按時完成作業,直到第10天,出了意外,兩個學生出去旅游花了5天時間,這5天時間里兩個人都沒有做作業。任務被拖延了。這時候兩個學生采取的策略就不同了:schedule重新安排了任務時間,旅游回來的第一天做第11天的任務,第二天做第12天的任務,最后完成任務花了35天。scheduleAtFixedRate是個守時的學生,她總想按時完成老師的任務,于是在旅游回來的第一天把之前5天欠下的任務以及第16天當天的任務全部完成了,之后還是按照老師的原安排完成作業,最后完成任務花了30天。(不一定是第一天就完成之前5天的任務,因任務執行時間而定,但會連續執行任務,不間隔,直到趕上之前時間節點的任務安排為止.)
下面以實示例演示什么是追趕特性。?
import java.util.Calendar; import java.util.Date; import java.util.Timer; import java.util.TimerTask;public class Test {public static void main(String[] args) throws InterruptedException {MyTask myTask = new MyTask();System.out.println("現在執行時間為:" + new Date());Calendar c = Calendar.getInstance();c.set(Calendar.SECOND, c.get(Calendar.SECOND) - 20);Date runDate = c.getTime();System.out.println("計劃執行時間為:" + runDate);Timer timer = new Timer();//調用的是schedule方法,驗證其不具追趕性timer.schedule(myTask, runDate, 4000);} }class MyTask extends TimerTask {@Overridepublic void run() {System.out.println("begin timer=" + new Date());System.out.println("end timer=" + new Date());}}部分運行結果如圖 5-1所示?
圖 5-1 不追趕?時間“Fri Aug 11 19:43:47 CST 2017”到“Fri Aug 11 19:44:07 CST 2017”之間的時間所對應的Task任務就被取消掉,不被執行了,這就是Task任務不追趕。
驗證scheduleAtFixedRate方法具有追趕執行性:
import java.util.Calendar; import java.util.Date; import java.util.Timer; import java.util.TimerTask;public class Test {public static void main(String[] args) throws InterruptedException {MyTask myTask = new MyTask();System.out.println("現在執行時間為:" + new Date());Calendar c = Calendar.getInstance();c.set(Calendar.SECOND, c.get(Calendar.SECOND) - 20);Date runDate = c.getTime();System.out.println("計劃執行時間為:" + runDate);Timer timer = new Timer();//調用scheduleAtFixedRate方法,測試其具有追趕性timer.scheduleAtFixedRate(myTask, runDate, 4000);} }class MyTask extends TimerTask {@Overridepublic void run() {System.out.println("begin timer=" + new Date());System.out.println("end timer=" + new Date());}}部分運行結果如圖 5-2 所示:?
圖 5-2 追趕將兩個時間段內所對應的Task任務被“補充性”地執行,這就是Task任務追趕特性。
超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生總結
以上是生活随笔為你收集整理的Java并发编程—schedule方法和scheduleAtFixedRate方法的区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java并发编程—ScheduledTh
- 下一篇: Java并发编程—如何实现线程的超时中断