2013-04-18 138 views
12

我對ExecutorService#shutdown方法的javadoc感到困惑。這些矛盾的言論是不是?ExecutorService shutdown

啓動有序關閉,其中先前提交的任務執行爲 ,但不會接受任何新任務。此方法不會等待 以前提交的任務完成執行。使用 等待終止來做到這一點。

如果它可以有序地關閉先前提交的任務,那麼它如何才能等待它們完成執行?

+0

評論意味着以前的任務不會被丟棄。不是他們會立即執行。使用'awaitTermination()'。 –

+0

例程幾乎立即返回,而不是等待所有任務完成。 –

回答

13

這意味着該方法立即在您調用它的線程中返回,但尚未執行的任務可能仍在其他線程中運行。

如果您希望程序等待之前提交的任務完成,則必須在致電shutdown之後調用awaitTermination

+0

確切地說,它簡單地分離了兩個問題。有些情況下你想不經過等待就關機。 – user1225148

+0

我可以想象調用awaitTermination()方法就像在ExecutorService實例上調用.join()一樣嗎?如果我沒有調用awaitTermination(),那麼主線程(或者調用者線程,確切地說)會同時與ExecutorService線程一起繼續。如果我調用awaitTermination(),主線程將停止執行,直到ExecutorService線程完成。請確認我的理解是否正確? – RuntimeException

6

這意味着任務將運行到完成,但此方法將立即返回,無需等待發生。

所以,正常關閉你的遺囑執行人沒有殺死任何任務,你會怎麼做:

executor.shutdown(); 
executor.awaitTermination(long timeout, TimeUnit unit); 

或者,如果你只是想盡快停止你的遺囑執行人,使用shutdownNow()