2016-07-31 131 views
1

下面的代碼:程序爲什麼要等待schedule()完成,但不等待scheduleWithFixedDelay()?

ScheduledExecutorService service = null; 
try { 
    service = Executors.newSingleThreadScheduledExecutor(); 
    Runnable task1 =() -> System.out.println("Executed only once"); 
    Runnable task2 =() -> System.out.println("Executed repeatedly"); 

    service.schedule(task1, 5, TimeUnit.SECONDS); 
    service.scheduleWithFixedDelay(task2, 6, 2, TimeUnit.SECONDS); 
} finally { 
    if (service != null) { 
     service.shutdown(); 
    } 
} 

當執行上面的代碼程序等待5秒至運行時間表(),但之後它完成,而無需運行scheduleWithFixedDelay()。

我懷疑原因是schedule()與scheduleWithFixedDelay()同步執行,但我沒有在文檔中找到有利於此的參數。

回答

2

這是一個微妙的一點,但我認爲答案在於documentation for shutdown的措辭:

發起在以前已提交任務的執行一個有序的關閉,但沒有新的任務將被接受。

您的第一個任務符合「先前提交的任務」的要求,因此shutdown()會等待它執行。

從技術上講,重複的任務是以前提交的,但是因爲它會一直重複,所以等待它完成是不可能的。試圖這樣做會違反shutdown()的合同。所以,我想說唯一的選擇是忽略重複任務的未來執行。