Java 如何在线程池中响应已取消的futuretask?

Java 如何在线程池中响应已取消的futuretask?,java,multithreading,Java,Multithreading,我使用ThreadPoolExecutor运行一些操作,有时我取消了一些未来的任务,并将其存储到列表中,以安排其他任务执行,然后我希望对保存的已取消的未来任务做出反应 但问题是,当我将任务提交到池中时,它不会被执行,看起来线程执行器保存并识别了取消或完成标志,因此不会调用该线程 我应该怎么做?使用Runnable而不是线程。执行池可以像处理线程一样处理可运行的,但是可运行的可以被重新运行多次。如果想要返回值,可以使用可调用的 实现保持取消状态。本质上,当再次调用run()方法时,它会执行一个CA

我使用ThreadPoolExecutor运行一些操作,有时我取消了一些未来的任务,并将其存储到列表中,以安排其他任务执行,然后我希望对保存的已取消的未来任务做出反应

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


我应该怎么做?

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

如果想要返回值,可以使用可调用的

实现保持取消状态。本质上,当再次调用run()方法时,它会执行一个CAS操作,该操作会失败,因为状态不可运行,并且在不调用内部的
Callable
的call()方法的情况下立即返回。我找不到从中检索原始可调用任务或将FutureTask恢复为未取消状态的方法

作为对你应该做什么的回应。。。
你必须取消吗?为什么不让他们跑呢?如果希望执行优先级,请尝试使用创建
ThreadPoolexecutor
,并使用建立优先级。这将允许以正确的顺序执行任务,因为它们将根据
比较器的结果添加到
优先级阻塞队列中
-1:不是答案。OP不是直接使用线程,而是在ThreadPoolExecutor中使用FutureTasks。Java库中的所有执行池都是ThreadPoolExecutor,这是OP已经在使用的。谢谢,实际上我刚刚实现了一个自定义FutureTask类,它包含对原始Runnable的引用,然后我可以重新提交它。@virsir,好的,不过要小心。FutureTask在executor中的工作方式是,尽管取消了FutureTask,但仍将选择该FutureTask执行。cancel标志只是将run方法转换为no-op。您必须确保不要尝试重复使用同一FutureTask实例。