日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java并发编程—schedule方法和scheduleAtFixedRate方法的区别

發布時間:2024/4/15 java 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java并发编程—schedule方法和scheduleAtFixedRate方法的区别 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

原文作者:一葉丿清風

原文地址:schedule方法和scheduleAtFixedRate方法的區別

schedule方法和scheduleAtFixedRate方法都可以實現任務的延時和不延時執行且都會按順序執行,因此不需要考慮非線程安全的情況。它們的主要區別只在于有沒有追趕特性。具體如下:

  • 任務執行未超時, 下次執行時間=上次執行開始時間+period;
  • 任務執行超時,?下次執行時間=上次執行結束時間;
  • 舉個例子:暑假到了老師給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方法的区别的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。