gpt4 book ai didi

java - cancel() vs remove() 在执行者上

转载 作者:行者123 更新时间:2023-11-29 05:05:10 24 4
gpt4 key购买 nike

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

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

删除:

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

cancel中的false是因为我只想移除一个队列任务,如果它运行了,让它完成。

最佳答案

使用 Future.cancel()

ThreadPoolExecutor.remove() 的 Javadoc声明它可能“无法删除在放入内部队列之前已转换为其他形式的任务”,因此我不建议调用它,除非您确定该任务未在内部转换。

鉴于此,如果您有一个 Future , 我建议通过调用 Future.cancel() 来取消它.如果其他人有对 Future 的引用,这还有做正确事情的额外好处。并决定调用 Future.get()

如果您对被取消的任务所使用的堆数量有疑虑,您可以调用ThreadPoolExecutor.purge()打电话后 Future.cancel() .

顺便说一句,ThreadPoolExecutor.purge()方法仅删除已取消的 Futures,因此调用 purge()remove() 之后很可能是空操作。

关于java - cancel() vs remove() 在执行者上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30599950/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com