我有一项任务需要我安排任务并在发生特定事件时将其删除。我正在使用 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 接口中未指定的 ScheduledThreadPoolExecutor.queue 属性。我有点担心我可能会违反 ScheduledThreadPoolExecutor 的不变量,我会发现它太晚了。
那么,这些片段会做我想让他们做的事情吗?有没有更好/更清洁的方法来做到这一点?