【问题标题】:cancel() vs remove() on executors执行程序上的取消()与删除()
【发布时间】:2015-08-16 11:22:33
【问题描述】:

最近我使用 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

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

【问题讨论】:

    标签: java future threadpoolexecutor


    【解决方案1】:

    使用Future.cancel()

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

    鉴于此,如果您有Future,我建议您致电Future.cancel() 取消它。如果其他人引用了Future 并决定调用Future.get(),这具有做正确事情的额外优势

    如果你对被取消的任务使用的堆大小有疑虑,你可以在调用Future.cancel()之后再调用ThreadPoolExecutor.purge()

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

    【讨论】:

      【解决方案2】:

      我会使用对你来说更自然的那个。没有更多信息,很可能是cancel

      remove/purge 的成本要高得多,而且只有在您担心会执行很多此类任务时才真正需要它们,它们可能会占用过多的内存。

      区别很明显,取消只是取消任务。 remove/purge 从队列中移除任务。

      【讨论】:

      • 我正在使用一个priorityQueue,因此我保存了一个ComparableFutureTask,因为这表明:stackoverflow.com/questions/30574777/…我重写了执行以返回该ComparabaleFutureTask,并保存所有引用并在这个对象上执行cancel()。并且由于某种原因它不起作用......我认为需要针对该事件打开一个新问题,但它是否假设在可比较的FutureTask 上也可以工作?任意
      • @sharongur 你是什么意思; “它不起作用”,您期望会发生什么?
      • 我取消了任务并重新插入了一个具有更高优先级的新任务,但执行顺序保持不变。并且没有插入新任务
      • @sharongur 所以问题与插入不取消或删除有关?即与问题无关?
      • 我实际上完全按照我发布的问题的建议做了,但是当我添加了 cancel();当我没有启动相同的方法时,我没有看到任何区别。无论如何,我没有调查到足以提出另一个问题。我会尝试自己解决它,如果我找不到解决方案,我会再次出现在这里 :) 感谢您的帮助!
      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2016-03-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-20
        • 1970-01-01
        • 2016-12-04
        相关资源
        最近更新 更多