【问题标题】:How to reactive a cancelled futuretask in thread pool?如何重新激活线程池中取消的未来任务?
【发布时间】:2010-10-31 12:59:10
【问题描述】:

我使用 ThreadPoolExecutor 来运行一些操作,有时我取消了一些未来的任务并将其存储到一个列表中以安排一些其他任务要做,然后我想响应保存的已取消的未来任务。

但问题是当我将任务提交到池中时,它不会被执行,看起来取消或完成标志被线程执行器保存并识别,因此不会调用该线程。

我该怎么办?

【问题讨论】:

    标签: java multithreading


    【解决方案1】:

    FutureTask 实现保持取消状态。本质上,当再次调用 run() 方法时,它会执行 CAS 操作,但由于状态不可运行而失败并立即返回,而无需调用内部 Callable 的 call() 方法。我看不到从中检索原始 Callable 或将 FutureTask 恢复到未取消状态的方法。

    回应你应该怎么做... 你必须取消它们吗?为什么不让他们跑?如果您想要优先执行,您可以尝试使用PriorityBlockingQueue 创建您的ThreadPoolexecutor 并使用Comparator 来确定优先级。这将允许任务以正确的顺序执行,因为它们将根据Comparator 的结果添加到PriorityBlockingQueue

    【讨论】:

    • 谢谢,实际上我刚刚实现了一个自定义的 FutureTask 类,它包含对原始 Runnable 的引用,然后我可以重新提交它。
    • @virsir,好的,不过要小心。 FutureTask 在 executor 中的工作方式是,尽管已取消它,但 FutureTask 将被选中执行。取消标志只是将运行方法转换为无操作。您必须确保不要尝试重复使用相同的 FutureTask 实例。
    【解决方案2】:

    使用Runnable 代替线程。执行池可以像处理Thread 一样处理Runnable,但Runnable 可以重新运行多次。

    【讨论】:

    • -1:不是答案。 OP 没有直接使用线程,他在 ThreadPoolExecutor 中使用 FutureTasks。 Java 库中的所有执行池都是 ThreadPoolExecutors,这是 OP 已经在使用的。
    【解决方案3】:

    如果你想有一个返回值,你可以使用 Callable。 http://download.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/Callable.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-12
      • 2018-12-27
      • 1970-01-01
      • 2022-01-19
      • 2012-09-12
      相关资源
      最近更新 更多