2010-10-31 42 views
2

我使用ThreadPoolExecutor来运行一些操作,在某些时候我取消了一些未来的任务并将其存储到一个列表中,以便安排一些其他任务来完成,之后我想响应保存的取消未来任务。如何在线程池中响应已取消的futuretask?

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

我该怎么办?

回答

1

使用Runnable而不是线程。执行池可以像Thread一样处理Runnable,但Runnable可以重新运行的次数。

+0

-1:不是答案。 OP不直接使用线程,他在ThreadPoolExecutor中使用FutureTasks。 Java库中的所有执行池都是ThreadPoolExecutors,这是OP已经在使用的内容。 – 2010-11-01 23:49:11

3

FutureTask实现保持取消状态。实质上,当再次调用run()方法时,它会执行CAS操作,该操作因为状态不可运行而不起作用,并且会立即返回而不调用内部的Callable的call()方法。我看不到一种方法来检索原始Callable或将FutureTask恢复到未取消状态。

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

+0

谢谢,实际上我只是实现了一个定制的FutureTask类,它包含对原始Runnable的引用,然后我可以重新提交它。 – virsir 2010-11-02 06:15:49

+0

@virsir,好的,但要小心。 FutureTask在执行者中的工作方式是尽管取消了它,FutureTask将被选中执行。取消标志只是将run方法转换为no-op。您必须确保不要尝试重新使用相同的FutureTask实例。 – 2010-11-02 19:47:39