并发 - 在不取消它的情况下中断未来

时间:2012-01-17 21:06:31

标签: java concurrency interrupt future

有没有办法在不取消它的情况下打断未来?

java doc API:

  

boolean 取消(boolean mayInterruptIfRunning)

  尝试取消执行此任务。如果任务有,则此尝试将失败   已经完成,已经取消,或者不可能   由于其他原因取消了。如果成功,这个任务还没有   调用cancel时启动,此任务永远不会运行。如果任务   已经启动,然后是mayInterruptIfRunning参数   确定执行此任务的线程是否应该是   因试图停止任务而中断。

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

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

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

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

3 个答案:

答案 0 :(得分:8)

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

将这些抽象视为客户代码与期货执行者之间的交互。从概念上讲,说“取消我要求你做的任务”是有道理的,因为你的任务是取消。我可能正在忙着工作,或者我可能还没有开始工作,或者它可能已经完成但是一切都很好,如果你想要我,我会取消它。这就是为什么我们有取消方法。

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

答案 1 :(得分:0)

无论如何,您可以使用超时,这样就可以中断等待。

get(long timeout, TimeUnit unit) 

答案 2 :(得分:0)

这样做有很多有用的用例。

由于Future API的问题在于它没有提供功能来检测执行已停止。即使Callable的执行仍在继续, isCancelled() isDone()也会愉快地返回true。

因此,在这个阶段,它真的不是关于 Future API的抽象级别。但它无法识别任务终止。或者换句话说,它无法区分取消请求和已完成的取消操作

一种解决方法是使用问题CountdownLatch中的Waiting for a cancelled future to actually finish。这将向等待的呼叫者发出信号,表明该任务实际已完成,而不仅仅是发出信号停止。