当Thread.interrupt()
在某个线程上调用 an 时,该线程会发生什么?
4 回答
目标线程被“中断”。大多数情况下,该线程中设置了一个标志,线程可以查看该标志(使用Thread.interrupted()
)。如果目标线程当前在某个 I/O 或 上被阻塞Object.wait()
,则分别使用 anInterruptedIOException
或 an唤醒它InterruptedException
。
线程中断是轻推线程的一种温和方式。它用于让线程有机会干净地退出,而不是Thread.stop()
,这更像是用突击步枪射击线程。
该方法的 Javadoc解释了在什么情况下会发生什么。
这是 JDK 1.6 Javadoc:
中断这个线程。
除非当前线程正在中断自己,这总是允许的,否则会调用该线程的 checkAccess 方法,这可能会导致抛出 SecurityException。
如果该线程在调用 Object 类的 wait()、wait(long) 或 wait(long, int) 方法或 join()、join(long)、join(long, int) 时被阻塞, sleep(long), or sleep(long, int), 这个类的方法,那么它的中断状态会被清除并且会收到一个InterruptedException。
如果此线程在可中断通道上的 I/O 操作中被阻塞,则通道将关闭,线程的中断状态将被设置,并且线程将收到 ClosedByInterruptException。
如果此线程在 Selector 中被阻塞,则线程的中断状态将被设置,并且它将立即从选择操作返回,可能带有非零值,就像调用了选择器的唤醒方法一样。
如果前面的条件都不成立,则将设置该线程的中断状态。
中断一个不活动的线程不需要有任何效果。
蔡司是正确的,信号是最干净的方法。您还可以捕获中断异常并以这种方式进行清理。