有没有办法在不取消它的情况下打断未来?
boolean 取消(boolean mayInterruptIfRunning)
尝试取消执行此任务。如果任务有,则此尝试将失败 已经完成,已经取消,或者不可能 由于其他原因取消了。如果成功,这个任务还没有 调用cancel时启动,此任务永远不会运行。如果任务 已经启动,然后是mayInterruptIfRunning参数 确定执行此任务的线程是否应该是 因试图停止任务而中断。
要捕获中断,我们必须正确捕获Interrupted Exception或检查Runnable / Callable方法中的isInterrupted()方法。
但是没有办法使用Future接口中断正在运行的Future
由于所有线程都在Executor Service池中,因此没有人可以执行thread.interrupt()。 这就是为什么假设只有当Future被取消或线程池终止时才会出现任何中断?
我试图理解为什么Future接口中没有中断方法。 任何帮助将不胜感激
答案 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。这将向等待的呼叫者发出信号,表明该任务实际已完成,而不仅仅是发出信号停止。