2012-02-14 28 views

回答

30

爲了做到這一點,您需要將submit()任務轉換爲ExecutorService,而不是調用​​。當您這樣做時,會返回一個Future,用於操作計劃任務。特別是,您可以在相關的Future上調用cancel(true)來中斷當前正在執行的任務(如果任務尚未開始運行,則完全跳過執行)。

順便提一下,Executors.newSingleThreadExecutor()返回的對象實際上是ExecutorService

+2

爲此,您不必手動確保線程是可中斷的。並非所有的線程都可以被中斷。 - 我想無論如何。 – 2014-05-09 10:39:06

+2

是的,它描述瞭如何中斷運行任務的線程。任務是否響應中斷是另外一個問題。這取決於任務在做什麼。 – erickson 2014-05-09 17:19:55

+0

@erickson我也有類似的問題[這裏](http://stackoverflow.com/questions/29159184/how-can-i-interrupt-resttemplate-call-as-soon-as-my-thread-is-中斷)與線程中斷有關。如果可能的話,你能幫我在那邊嗎?我還沒有收到任何答覆,所以任何幫助將不勝感激。 – john 2015-03-21 06:45:40

4

中斷執行程序的內部管理線程的另一種方法是在ExecutorService上調用shutdownNow(..)方法。然而請注意,與@ erickson的解決方案相反,這將導致整個ThreadPoolExecutor不適合進一步使用。

我發現在該ExecutorService不再需要,並保持標籤上Future情況下是不必要的,否則這種情況下,方法尤其有效(這是你的應用程序的exit(..)方法的一個最好的例子)。從ExecutorService#shutdownNow(..)的javadoc

相關信息:

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

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