当前位置: 首页 > 知识库问答 >
问题:

执行器上的cancel()与remove()

任文乐
2023-03-14

最近,我使用了ThreadPoolExecutor和priorityqueue,并在将来遇到了这两种方法。对未来任务执行cancel()。和任务。remove(),将其从队列中移除。

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

移除:

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

取消:

futureObject.cancel(false);

我使用了以下方法:http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/ThreadPoolExecutor.html#remove(java.lang.Runnable)

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

共有3个答案

韦安怡
2023-03-14

如果希望覆盖取消,或者您主要关心的是内存占用,请使用删除/清除。但在任何其他情况下,我都会选择取消

西门胜涝
2023-03-14

我会使用对你来说更自然的。如果没有进一步的信息,很可能是取消

remove/purge的成本要高得多,只有当您担心这些任务太多,可能会占用太多内存时,才真正需要它。

区别是不言自明的,取消只是取消任务。删除/清除从队列中删除任务。

左丘繁
2023-03-14

使用< code>Future.cancel()

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

考虑到这一点,如果您有一个Future,我建议通过调用Future.cancel()来取消它。如果其他人引用了Future并决定调用Future.get(),那么这样做还有一个额外的好处

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

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

 类似资料:
  • 问题内容: 我正在尝试使一些ASyncTask优先运行。 我已经创建了一个带有PriorityBlockingQueue的ThreadPoolExecutor,并且该属性比较器对于标准Runnable来说效果很好。但是打电话时 PriorityBlockingQueue的Comparator接收ASyncTask内部的Runnable(私有)(在源代码中称为mFuture),因此在比较器中,我无法

  • Cancels asynchronous iteration.

  • 大家:我在找一个有更多知识的人来检查我对蜂巢和火花的理解 我一直在研究不同的大型数据库解决方案,并试图理解Hive和Spark在执行方面的差异。我尝试安装Hadoop、Hive和Spark,看看它们的性能如何。我能够让Hadoop和Spark工作。我无法让Hive去工作。

  • 我已经安装了MySQL 5.5。34,Apache2.2。15和PHP5.5。4在我的linux Redhat系统(2.6.32-220.17.1.el6.x86_64)上按各自的顺序排列。 当php脚本在web浏览器上运行时,它被apache解释为html,尽管它在命令行中运行良好。 我在httpd.conf文件中做了以下更改:我有未注释的LoadMoulesphp5_module模块/libp

  • 本文向大家介绍Java Timer cancel()方法与示例,包括了Java Timer cancel()方法与示例的使用技巧和注意事项,需要的朋友参考一下 计时器类方法 cancel()方法在java.util包中可用。 cancel()方法用于取消此Timer并丢弃当前计划的任何任务。 cancel()方法是一个非静态方法,只能通过类对象访问,如果尝试使用类名访问该方法,则会收到错误消息。