[英]How to remove a task from ScheduledExecutorService?
我有一個ScheduledExecutorService
,它使用scheduleAtFixedRate(Runnable, INIT_DELAY, ACTION_DELAY, TimeUnit.SECONDS);
定期對幾個不同的任務scheduleAtFixedRate(Runnable, INIT_DELAY, ACTION_DELAY, TimeUnit.SECONDS);
我還有一個與此調度程序一起使用的不同Runnable
。 當我想從調度程序中刪除其中一項任務時,問題就開始了。
有沒有辦法做到這一點?
我使用一個調度程序來處理不同的任務是否正確? 實現這一點的最佳方法是什么?
只需取消scheduledAtFixedRate()
返回的未來:
// Create the scheduler
ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1);
// Create the task to execute
Runnable r = new Runnable() {
@Override
public void run() {
System.out.println("Hello");
}
};
// Schedule the task such that it will be executed every second
ScheduledFuture<?> scheduledFuture =
scheduledExecutorService.scheduleAtFixedRate(r, 1L, 1L, TimeUnit.SECONDS);
// Wait 5 seconds
Thread.sleep(5000L);
// Cancel the task
scheduledFuture.cancel(false);
另一件要注意的事情是取消不會從調度程序中刪除任務。 它確保的是isDone
方法總是返回true
。 如果您不斷添加此類任務,這可能會導致內存泄漏。 例如:如果您根據某些客戶端活動或 UI 按鈕單擊啟動任務,請重復執行 n 次並退出。 如果該按鈕被點擊太多次,你可能最終會得到無法被垃圾收集的大線程池,因為調度程序仍然有一個引用。
您可能希望在 Java 7 以后可用的ScheduledThreadPoolExecutor
類中使用setRemoveOnCancelPolicy(true)
。 為了向后兼容,默認設置為 false。
如果您的ScheduledExecutorService
實例擴展了ThreadPoolExecutor
(例如ScheduledThreadPoolExecutor
),您可以使用remove(Runnable)
(但請參閱其 javadoc 中的注釋:“在放入內部隊列之前,它可能無法刪除已轉換為其他形式的任務。” ) 或purge()
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.