最近我使用ThreadPoolExecutor和priorityqueue,并在未来的任务中遇到了两个方法future.cancel()。 并将task.remove()放在自己的任务上,将其从队列中删除。
什么是更好的选择?有什么不同吗?我可以保存两者的列表(从submit()接收的未来对象或任务本身),不知道要使用什么...
删除:
executor.remove(task);
executor.purge();
取消:
futureObject.cancel(false);
取消中的错误是因为我只想删除一个队列任务,如果它运行,就让它完成。
答案 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
。