你能解释一下调用java.lang.Thread.interrupt()时做什么吗?


当前回答

如果目标线程一直在等待(通过调用wait(),或其他一些本质上做同样事情的相关方法,如sleep()),它将被中断,这意味着它将停止等待它正在等待的东西,而是接收一个InterruptedException。

完全由线程本身(调用wait()的代码)决定在这种情况下做什么。它不会自动终止线程。

它有时与终止标志结合使用。当被中断时,线程可以检查这个标志,然后关闭自己。但这只是惯例。

其他回答

thread. interrupt()将目标线程的中断状态/标志设置为true,当使用thread. interrupted()检查时,可以帮助停止无休止的线程。请参阅http://www.yegor256.com/2015/10/20/interrupted-exception.html

thread. interrupt()设置目标线程的中断状态/标志。然后在目标线程中运行的代码可以轮询中断状态并适当地处理它。一些阻塞的方法,如Object.wait()可能会立即使用中断状态并抛出适当的异常(通常是InterruptedException)

Java中的中断不是先发制人的。换句话说,两个线程必须合作才能正确地处理中断。如果目标线程没有轮询中断状态,中断将被有效地忽略。

轮询通过thread .interrupted()方法进行,该方法返回当前线程的中断状态并清除中断标志。通常,线程可能会做一些事情,例如抛出InterruptedException。

EDIT(来自Thilo评论):一些API方法内置了中断处理。在我的头顶,这包括。

Object.wait(), Thread.sleep()和Thread.join() 大多数java.util.concurrent结构 Java NIO(但不是Java .io),它不使用InterruptedException,而是使用ClosedByInterruptException。

编辑(来自@thomas-pornin对完全相同问题的回答)

线程中断是轻推线程的一种温和方式。它用于给线程一个干净地退出的机会,而不是thread .stop(),后者更像是用突击步枪射击线程。

如果目标线程一直在等待(通过调用wait(),或其他一些本质上做同样事情的相关方法,如sleep()),它将被中断,这意味着它将停止等待它正在等待的东西,而是接收一个InterruptedException。

完全由线程本身(调用wait()的代码)决定在这种情况下做什么。它不会自动终止线程。

它有时与终止标志结合使用。当被中断时,线程可以检查这个标志,然后关闭自己。但这只是惯例。

在以上回答的基础上,我想补充一两件事。

需要记住的一件事是,调用中断方法并不总是会导致InterruptedException。因此,实现代码应该定期检查中断状态并采取适当的操作。 thread. currentthread (). isinterrupted()也可以用来检查线程的中断状态。与Thread.interrupted()方法不同,它不清除中断状态。

Thread.interrupt()方法设置内部的“中断状态”标志。通常该标志由Thread.interrupted()方法检查。

按照惯例,任何通过InterruptedException存在的方法都必须清除中断状态标志。