【发布时间】:2012-09-24 16:38:16
【问题描述】:
我有一项任务需要我安排任务并在发生特定事件时将其删除。我正在使用 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 的不变量,我会发现它太晚了。
那么,这些 sn-ps 会做我想让他们做的事吗?有没有更好/更清洁的方法?
【问题讨论】:
标签: java multithreading executors