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存储期货上的方法取消其未来的迭代.
我会使用一个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)