ScheduledThreadPoolExecutor

ScheduledThreadPoolExecutor

我有一项任务,要求我安排任务并在发生特定事件时将其删除。我正在使用ScheduledThreadPoolExecutor安排任务,这很简单。但是,我发现了两种取消待处理项目的方法,它们看起来都有些奇怪。

我很好奇它们中的任何一个是否达到生产质量。如果它们都不是,那么您有什么建议?

这是我所做的事情的基本内容:

private final ScheduledThreadPoolExecutor scheduler = new ScheduledThreadPoolExecutor(1);

public void doStuff() {
    //...
    scheduler.schedule(new Runnable() {/*...*/}, 10, TimeUnit.MILISECONDS)
}

public void actOnEvent() {
    cancelPendingItems();
    doMoreStuff();
}

public void cancelPendnigItems() {
    // TODO implement me
}

这是候选人1:
public void cancelPendingItems() {
    scheduler.getQueue().clear();
}

这是候选人2:
public void cancelPendingItems() {
    for (Runnable task : scheduler.getQueue()) {
        scheduler.remove(task);
    }
}

在我看来,这两者都是一个hack,因为它们都依赖于ScheduledExecutor接口(interface)中未指定的ScheduledThreadPoolExecutor.queue属性。我有点担心我可能会违反ScheduledThreadPoolExecutor的不变式,而我将发现它为时已晚。

那么,这些代码片段会执行我希望它们执行的操作吗?有更好/更清洁的方法吗?

最佳答案

注意 ScheduledExecutorService.schedule 返回 ScheduledFuture 。只需存储它们,然后在调用cancel方法时,对存储的 future 使用cancel方法即可取消其将来的迭代。

关于java - 如何从ScheduledThreadPoolExecutor取消挂起的项目?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12569267/

10-11 10:58