13

有没有办法在不取消 Future 的情况下中断它?

java文档API:

boolean cancel (boolean mayInterruptIfRunning)

尝试取消此任务的执行。如果任务已完成、已被取消或由于某些其他原因无法取消,则此尝试将失败。如果成功,并且在调用取消时此任务尚未启动,则此任务不应该运行。如果任务已经开始,则 mayInterruptIfRunning 参数确定是否应该中断执行该任务的线程以尝试停止该任务。

要捕获中断,我们必须正确捕获 Interrupted Exception 或检查 Runnable / Callable 方法中的 isInterrupted() 方法。

但是没有办法使用 Future 接口中断正在运行的 Future

由于所有线程都在 Executor Service 池中,没有人可以做 thread.interrupt()。这就是为什么假设只有当 Future 被取消或线程池终止时才会出现任何中断?

我试图理解为什么 Future 接口中没有中断方法。任何帮助将不胜感激

4

3 回答 3

9

原因在于作为 Future 的抽象和线程中的具体执行的不同。我们不能说未来是否与单个线程或多个线程相关联。未来可能会开始新的线程,开始新的未来等。

将这些抽象视为客户端代码和期货执行者之间的交互。从概念上讲,说“取消我要求你做的这个任务”是有道理的,因为取消是你的任务。我可能正忙着处理它,或者我可能还没有开始它,或者它可能已经完成但没关系,如果你想要我我会取消它。所以这就是我们有一个取消方法的原因。

另一方面,说“打断你的任务”并没有多大意义。由于动作的结果(Future)和执行模型(比如 Executor)之间的解耦,客户端不知道正在采取什么动作来完成任务。那么如何期望客户端知道何时适合、需要或什至支持中断。

于 2012-01-22T00:18:55.253 回答
0

无论如何,您都可以使用超时,因此您可以中断等待。

get(long timeout, TimeUnit unit) 
于 2012-02-01T20:06:26.843 回答
0

有一些有用的用例可以做到这一点。

由于 Future API 的问题在于它不提供检测执行已停止的能力。即使 Callable 继续执行,isCancelled()isDone()都将愉快地返回 true。

所以这真的不是现阶段Future API的抽象程度。但它无法识别任务终止。或者换句话说,无法区分取消请求和已完成的取消操作

一种解决方法是使用CountdownLatch,如问题Waiting for a cancelled future to actual finish中所做的那样。这将向等待的调用者发出任务实际上已完成的信号,而不仅仅是发出停止信号。

于 2016-01-30T00:20:58.907 回答