使用選項1,您可以使用FutureTask.cancel()與mayInterruptIfRunning
參數設置爲true
取消任務。
ScheduledExecutorService.scheduleAtFixedRate()創建一個ScheduledFuture,仍然可以通過FutureTask api取消。
這是我用來驗證任務被取消的天真測試。如果你做了一些阻塞IO(網絡或磁盤),我想工作者線程可能不會被打斷,但我還沒有測試過。如果在任務沒有運行的時候調用cancel函數,這一切都會很好地停止,但是如果在調用cancel函數時任務正在運行,執行程序將嘗試終止線程。
public static void main(String[] args) throws InterruptedException {
ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(2);
ScheduledFuture<?> future = executor.scheduleAtFixedRate(new Runnable() {
int i = 0;
public void run() {
int j = i++;
System.err.println("Run " + j);
try {
Thread.sleep(5000L);
} catch (InterruptedException e) {
System.err.println("Interrupted " + j);
}
}
}, 1000L, 2000L, TimeUnit.MILLISECONDS);
Thread.sleep(10000L);
System.err.println("Canceled " + future.cancel(true));
Thread.sleep(20000L);
executor.shutdownNow();
System.err.println("Finished");
}
沒錯,但有兩個缺點。首先,如果我在線程中啓動一個長進程,我必須不斷地引用isInterrupted標誌;第二,我必須調用shutdown來釋放正在運行的線程,這將阻塞用戶,直到線程運行完畢 – lili 2012-03-28 19:27:09
ExecutorService返回的FutureTask將您抽象爲使用線程。按照JavaDoc,如果您爲mayInterruptIfRunning傳遞true,它將負責中斷工作線程。 – 2012-03-28 19:34:45
不完全是根據恩諾鹽路的回答是:http://stackoverflow.com/questions/2903342/why-thread-started-by-scheduledexecutorservice-schedule-never-quits – lili 2012-03-28 19:36:09