2010-06-10 103 views
3

我今天發佈了關於線程模式的question,幾乎所有人都建議我查看ExecutorService。當executorservice關閉時,運行/阻塞的runnables會發生什麼()

當我正在查看ExecutorService時,我想我錯過了一些東西。如果服務具有正在運行或被阻塞的線程,並且有人調用ExecutorService.shutdown(),會發生什麼情況。正在運行或阻止的線程會發生什麼?

ExecutorService在終止之前是否等待這些線程完成?

我之所以問這個問題的原因是因爲很久以前我曾經涉足Java,他們不贊成使用Thread.stop(),我記得停止線程的正確方法是在必要時使用sempahores並擴展Thread :

public void run() { 
    while (!this.exit) { 
     try { 
      block(); 
      //do something 
     } catch (InterruptedException ie) { 
     } 
    } 
} 

public void stop() { 
    this.exit = true; 

    if (this.thread != null) { 
     this.thread.interrupt(); 
     this.thread = null; 
    } 
} 

ExecutorService如何處理正在運行的線程?

回答

9

ExecutorService#shutdown()

發起在以前已提交任務的執行一個有序的關閉,但沒有新的任務將被接受。如果已關閉,調用沒有其他影響。

所以它會等待那些線程完成。

另一種是ExecutorService#shutdownNow()

嘗試停止所有正在執行的任務,暫停等待任務的處理,並返回等待執行的任務列表。

除了竭盡全力嘗試停止處理主動執行的任務之外,沒有任何保證。例如,典型的實現將通過Thread.interrupt()來取消,所以任何不能響應中斷的任務都不會終止。

你只需要在自己run()while環路上Thread#isInterrupted()聽。

+1

關於shutdown()的文檔中沒有任何內容表示線程將被中斷。 shutdownNow()的文檔表明實現可能會中斷正在運行的任務,但不需要它。 – dty 2010-06-10 21:49:45

+1

爲了避免混淆,我在編輯答案之前發佈了我的評論以正確匹配文檔。 – dty 2010-06-10 22:03:40

+1

@丹尼 - 你可以刪除你的評論... – 2010-06-10 22:11:08

1

我認爲文檔非常清晰!從內存中,它一直等到線程完成,除非你用另外的方法告訴shutdownNow()方法。

相關問題