Thread
的JavaDoc表示Thread.interrupt()
中断了一个线程如下:
- 在对象的
wait()
方法或其中一个方法中被阻止的主题join()
或sleep()
方法将被唤醒,其中断状态 将被清除,他们会收到InterruptedException
。- 在
InterruptibleChannel
的I / O操作中被阻塞的线程将设置其中断状态并接收ClosedByInterruptException
。此外,该频道将被关闭。- 在
Selector
中阻止的线程将设置其中断状态并立即返回。在这种情况下,他们不会收到例外。
如果该主题不符合上述任何条件,该怎么办?它被杀了还是继续运行或是什么?
提前致谢...
答案 0 :(得分:4)
如果被中断的线程没有检查Thread.isInterrupted()
并对其做了一些事情,那么在未阻塞的线程上调用Thread.interrupt()
除了简单地设置标志之外什么都没有。线程实现者的工作是用Thread.isInterrupted()
正确检查线程的状态并采取适当的措施。
答案 1 :(得分:0)
从JLS中读取的一些内容
17.2.3。中断
在调用Thread.interrupt时发生中断操作,如 以及定义为依次调用它的方法,例如 ThreadGroup.interrupt。
让t是调用u.interrupt的线程,对于某些线程u,其中t 你可能是一样的。此操作会导致您的中断状态 设置为true。
此外,如果存在一些其等待集包含u的对象m, 然后你被从m的等待集中移除。这使你能够恢复 等待动作,在这种情况下,等待将重新锁定m 监视器,抛出InterruptedException。
Thread.isInterrupted的调用可以确定一个线程 中断状态。静态方法Thread.interrupted可能是 由线程调用以观察并清除其自身的中断状态。
来自Thread.interrupt()
Javadoc
public void interrupt()
中断此主题。除非目前 线程正在打断自己,这总是被允许的 调用此线程的checkAccess方法,这可能会导致 抛出SecurityException。
如果在调用wait()时阻塞了这个线程,请等待(long), 或者等待(long,int)Object类或join()的方法, join(long),join(long,int),sleep(long)或sleep(long,int)方法 这个类,然后它的中断状态将被清除 收到InterruptedException。
如果此线程在可中断的I / O操作中被阻止 然后通道将关闭,线程的中断状态 将被设置,线程将收到ClosedByInterruptException。
如果在选择器中阻塞了该线程,则线程中断 状态将被设置,它将立即从选择中返回 操作,可能具有非零值,就像选择器一样 唤醒唤醒方法。
如果以前的条件都没有,则该线程会中断 状态将被设置。
中断非活动的线程无需任何效果。
要点:
如果某个线程位于wait
,sleep
,join
或其他使其处于等待状态的状态,则只会抛出InterruptedException
来通知某个线程他希望他能够阻止他正在做的事情和死亡。
如果它不是之前的状态,它只会设置一个标志(称为中断状态)。你可以理解它会做 nothing 以避免由早期中断的线程引起的一些错误,这可能导致你的对象处于不一致的状态(你无法知道它在做什么)。 / p>
线程使用此标志来确定是否有人要求他停止工作,由程序员决定是否停止线程(您可以自由忽略它。)
重要:wait
,sleep
等方法(如上所述)将在抛出异常时清除该标志。如果您执行while(!Thread.isInterrupted())
之类的操作来记住这一点,这一点非常重要。
如果需要,您可以使用isInterrupted
或interrupted
两者之间的唯一区别interrupted
将重置标记,而isInterrupted
则没有。
另一个很棒的读物,here。
(p.s我希望链接正确的JLS部分,我会搜索更多。)