簡體   English   中英

如何從 ScheduledExecutorService 中刪除任務?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM