并发性 - 中断未来而不取消它

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

java doc API:

布尔取消(布尔值可能中断)

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

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

但是没有办法使用“未来”接口中断正在运行的未来

由于所有线程都在执行器服务池中,因此没有人可以执行 thread.interrupt()。这就是为什么人们认为任何中断只会在 Future 被取消或线程池终止时才会出现的原因吗?

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


答案 1

原因是因为作为未来的抽象和线程中的具体执行的差异。我们不能说未来是与单线程还是多线程绑定。未来可能会开始新的线程,开始新的未来,等等。

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

另一方面,说“中断你的任务”没有多大意义。由于操作结果(未来)和执行模型(例如执行器)之间的解耦,客户端不知道正在采取哪些操作来完成任务。那么,如何期望客户端知道中断何时合适、必要甚至受支持。


答案 2

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

get(long timeout, TimeUnit unit) 

推荐