[英]How to make a ScheduledExecutorService terminate automatically when its scheduled task is cancelled
我正在使用ScheduledExecutorService
來關閉網絡連接,如果它已打開超過幾個小時。 但是,在大多數情況下,網絡連接在達到超時之前關閉,因此我取消了ScheduledFuture
。 在這種情況下,我還希望執行程序服務終止並釋放其線程池。
令我驚訝的是,這不是開箱即用的:雖然我在調度任務后在執行程序服務上調用了shutdown()
,但執行程序服務在其唯一的計划任務被取消時不會自動終止。 從ExecutorService.shutdown()
的JavaDoc中,這種行為甚至可能是正確的,因為可以說取消的任務還沒有被“執行”:
void java.util.concurrent.ExecutorService.shutdown()
啟動有序關閉,其中先前提交的任務將被執行,但不會接受任何新任務。 如果已經關閉,調用沒有其他影響。
我的問題是,是否可以更改:是否可以將執行程序服務配置為在其唯一的計划任務被取消時自動終止?
或者寫為JUnit測試的同一個問題:
@Test
public void testExecutorServiceTerminatesWhenScheduledTaskIsCanceled() throws Exception {
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
Runnable task = new Runnable() {
@Override
public void run() {
// ...
}
};
ScheduledFuture<?> scheduledTask = scheduler.schedule(task, 2000, TimeUnit.MILLISECONDS);
scheduler.shutdown();
// do more configuration here...
Thread.sleep(1000);
scheduledTask.cancel(false);
Thread.sleep(100);
assertThat(scheduler.isTerminated(), is(true)); // ... so that this passes!?
}
從ScheduledThreadPoolExecutor
( Executors.newScheduledThreadPool
返回的實際類型)文檔:
在提交的任務在運行之前取消時,將禁止執行。 默認情況下,此類已取消的任務不會自動從工作隊列中刪除,直到其延遲結束。 雖然這可以進一步檢查和監控,但也可能導致取消任務的無限制保留。 要避免這種情況,請將setRemoveOnCancelPolicy(boolean)設置為true,這會導致在取消時立即從工作隊列中刪除任務。
這是一個ScheduledThreadPoolExecutor
方法。 我不相信使用ScheduledExecutorService
接口純粹解決這個問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.