難道你想打電話給
executor.shutdownNow()
,將嘗試取消目前(使用Thread.interrupt
所以你需要實現在使用中斷標誌每個任務的「中斷政策」)正在運行的任務。
從javadoc中
嘗試停止所有正在執行的任務,暫停等待任務的處理,並返回等待執行的任務列表。
除了竭盡全力嘗試停止處理主動執行的任務之外,沒有任何保證。例如,典型的實現將通過Thread.interrupt取消,所以任何不能響應中斷的任務都可能永遠不會終止。
這將返回一個等待任務列表,因此您可以始終將其放回「等待列表」,而不是完全鬆開它們。您可能還需要使用「等待終止」來避免代碼被遺漏。例如,executor.awaitTermination(...)
。
tempus-fugit有一些方便的類來處理這個。您只需致電
shutdown(executor).waitingForShutdown(millis(400));
詳情請參閱here。
此外,您在博客文章中列出的解決方案;我不確定這是否正確。 Future.cancel
只會停止安排任務。如果您要更新博客中的示例以允許中斷(例如cancel(true)
,它將與shutdownNow
等效(或多或少)。也就是說,它將調用interrupt
關於下面的任務(如果您已經實施中斷策略)將停止它的處理,至於中斷後的清理,你只需要確保你在中斷策略實現中正確處理,結果是我認爲你可以使用shutdownNow來正確取消清除和 (或取消(true))
這實際上是我們當前的實現,但是通過該解決方案,我們保留對所有計劃作業(甚至是執行的作業)的引用,因此,引用列表增長很多,需要處理,他們將在內存中,直到調度程序舒tdown長。這會導致垃圾回收問題,你不覺得嗎? – ggarciao
它可能會做,但你只需要保留最後的N期貨。您可以在某個點後取消/放棄期貨。如果系統太落後,你就會遇到一個更復雜的問題。 –