如何从ScheduledThreadPoolExecutor中取消待处理的项目?

Tam*_*Rev 9 java multithreading executors

我有一项任务,要求我安排任务,并在发生特定事件时将其删除.我正在使用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
}
Run Code Online (Sandbox Code Playgroud)

这是候选人1:

public void cancelPendingItems() {
    scheduler.getQueue().clear();
}
Run Code Online (Sandbox Code Playgroud)

这是候选人2:

public void cancelPendingItems() {
    for (Runnable task : scheduler.getQueue()) {
        scheduler.remove(task);
    }
}
Run Code Online (Sandbox Code Playgroud)

两者看起来像是一个黑客,因为它们依赖于ScheduledExecutor接口中未指定的ScheduledThreadPoolExecutor.queue属性.我有点担心我可能会违反ScheduledThreadPoolExecutor的不变量而且我会发现它太迟了.

那么,这些片段是否会按照我希望他们做的去做?有没有更好/更清洁的方法呢?

Bri*_*ian 10

请注意,ScheduledExecutorService.schedule返回a ScheduledFuture.只需存储这些,并在调用cancel方法时,使用cancel存储期货上的方法取消其未来的迭代.


Pet*_*rey 5

我会使用一个List<Future>

private final List<Future> futures = ...

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

public void cancelPendingItems() {
    for(Future future: futures)
        future.cancel(true);
    futures.clear();
}
Run Code Online (Sandbox Code Playgroud)