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

AKS*_*KSG 13 java concurrency future interrupt

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

java doc API:

boolean cancel(boolean mayInterruptIfRunning)

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

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

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

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

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

mon*_*ack 8

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

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

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

  • http://docs.oracle.com/javase/tutorial/essential/concurrency/interrupt.html - 中断是对线程的指示,它应该停止正在执行的操作并执行其他操作。由程序员决定线程如何响应中断,但线程终止是很常见的。但是在 Future 的情况下,中断意味着终止。我同意中断可以做的任何事情,Future 都必须自己做——就像等待一个条件一样。但我不同意中断未来没有意义——尽管复杂性可能不值得 (2认同)