" boolean cancel(boolean mayInterruptIfRunning)尝试取消 执行此任务。如果任务已经完成,则此尝试将失败 已完成,已取消或无法取消 其他原因"
https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Future.html#cancel(boolean)
除了上面列出的原因之外,还有哪些其他原因导致无法取消任务? 此外,如果任务运行下面的代码可以取消吗?
while(true)
{
;
}
答案 0 :(得分:2)
您发布的while循环将是一个不可取消代码的示例,因为它不会响应中断。
阻止侦听套接字的代码也可能无法处理中断。即使代码因InterruptedIOException超时,如果在不设置中断标志的情况下吞下异常,代码也可能无法处理中断。
所以TLDR:1)阻止IO的代码 2)不知道中断如何工作的代码。或两者兼而有之。
答案 1 :(得分:0)
实际上没有好方法在Java中终止线程。您基本上可以告诉线程停止,但线程可以不断等待,永远不会读取标志或类似问题。这实际上是一个复杂的问题。所以我假设他们只是为了#34;某些问题"。
答案 2 :(得分:0)
每个线程都有一个特殊的标志,用于保存中断状态,可以通过isInterrupted()
方法访问。当有人中断线程时,此标志设置为true
。就这样。在由此线程执行的代码检查此标志并抛出InterruptedException
或者只是退出线程执行时,不会发生真正的中断。
标准库中的许多方法,用于阻止当前线程,实际上会不时检查此标志,并在发现标志设置时抛出InterruptedException
。例如,Thread.sleep()
,Thread.join()
,Object.wait()
,Lock.lockInterruptibly()
等等。因此,当您的线程明确地定期检查此标志或被某些隐式检查它的描述方法阻止时,它是可中断的。否则,它不是。
因此,具有空循环的线程不会被中断,因为它不会检查中断状态。但添加中断状态检查会解决它:
while (!Thread.currentThread().isInterrupted()) { }
调用响应中断的方法也可以起作用:
try {
while (true) {
Thread.sleep(timeout);
}
} catch(InterruptedException e) {
// Do nothing, just let the thread exit
}