对执行程序取消()vs remove()

时间:2015-06-02 15:12:33

标签: java future threadpoolexecutor

最近我使用ThreadPoolExecutor和priorityqueue,并在未来的任务中遇到了两个方法future.cancel()。 并将task.remove()放在自己的任务上,将其从队列中删除。

什么是更好的选择?有什么不同吗?我可以保存两者的列表(从submit()接收的未来对象或任务本身),不知道要使用什么...

删除:

executor.remove(task);
executor.purge();

取消:

futureObject.cancel(false);

我使用了以下内容: http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/ThreadPoolExecutor.html#remove%28java.lang.Runnable%29

取消中的错误是因为我只想删除一个队列任务,如果它运行,就让它完成。

3 个答案:

答案 0 :(得分:2)

使用Future.cancel()

ThreadPoolExecutor.remove()的Javadoc指出它可能“无法删除在放入内部队列之前已转换为其他形式的任务”,所以除非您确定该任务,否则我不建议调用它没有内部转换。

鉴于此,如果您有Future,我建议您致电Future.cancel()取消它。如果其他人引用了Future并决定调用Future.get()

,这样做还有一个额外的好处就是做正确的事情

如果您对已取消任务使用的堆数量感到偏执,可以在致电ThreadPoolExecutor.purge()后致电Future.cancel()

顺便说一下,ThreadPoolExecutor.purge()方法只删除已取消的期货,因此在purge()之后调用remove()可能是无操作。

答案 1 :(得分:1)

我会使用对你来说更自然的那个。没有最有可能是cancel

的更多信息

remove/purge要贵得多,只有当你担心自己会有这么多的任务时,他们可能会使用太多的内存。

区别是非常自我解释,取消只是取消任务。 remove / purge从队列中删除任务。

答案 2 :(得分:0)

如果您希望覆盖cancel或主要关注的是内存占用,请使用remove/purge。但在任何其他情况下,我都会选择cancel