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