我對ExecutorService#shutdown方法的javadoc感到困惑。這些矛盾的言論是不是?ExecutorService shutdown
啓動有序關閉,其中先前提交的任務執行爲 ,但不會接受任何新任務。此方法不會等待 以前提交的任務完成執行。使用 等待終止來做到這一點。
如果它可以有序地關閉先前提交的任務,那麼它如何才能等待它們完成執行?
我對ExecutorService#shutdown方法的javadoc感到困惑。這些矛盾的言論是不是?ExecutorService shutdown
啓動有序關閉,其中先前提交的任務執行爲 ,但不會接受任何新任務。此方法不會等待 以前提交的任務完成執行。使用 等待終止來做到這一點。
如果它可以有序地關閉先前提交的任務,那麼它如何才能等待它們完成執行?
這意味着該方法立即在您調用它的線程中返回,但尚未執行的任務可能仍在其他線程中運行。
如果您希望程序等待之前提交的任務完成,則必須在致電shutdown
之後調用awaitTermination
。
確切地說,它簡單地分離了兩個問題。有些情況下你想不經過等待就關機。 – user1225148
我可以想象調用awaitTermination()方法就像在ExecutorService實例上調用.join()一樣嗎?如果我沒有調用awaitTermination(),那麼主線程(或者調用者線程,確切地說)會同時與ExecutorService線程一起繼續。如果我調用awaitTermination(),主線程將停止執行,直到ExecutorService線程完成。請確認我的理解是否正確? – RuntimeException
這意味着任務將運行到完成,但此方法將立即返回,無需等待發生。
所以,正常關閉你的遺囑執行人沒有殺死任何任務,你會怎麼做:
executor.shutdown();
executor.awaitTermination(long timeout, TimeUnit unit);
或者,如果你只是想盡快停止你的遺囑執行人,使用shutdownNow()
。
評論意味着以前的任務不會被丟棄。不是他們會立即執行。使用'awaitTermination()'。 –
例程幾乎立即返回,而不是等待所有任務完成。 –