12

Thread.interrupt()在某个线程上调用 an 时,该线程会发生什么?

4

4 回答 4

33

目标线程被“中断”。大多数情况下,该线程中设置了一个标志,线程可以查看该标志(使用Thread.interrupted())。如果目标线程当前在某个 I/O 或 上被阻塞Object.wait(),则分别使用 anInterruptedIOException或 an唤醒它InterruptedException

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

于 2010-02-18T15:50:57.927 回答
2

方法的 Javadoc解释了在什么情况下会发生什么。

于 2010-02-18T15:48:15.950 回答
2

这是 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 中被阻塞,则线程的中断状态将被设置,并且它将立即从选择操作返回,可能带有非零值,就像调用了选择器的唤醒方法一样。

如果前面的条件都不成立,则将设置该线程的中断状态。

中断一个不活动的线程不需要有任何效果。

于 2010-02-18T15:49:27.367 回答
0

蔡司是正确的,信号是最干净的方法。您还可以捕获中断异常并以这种方式进行清理。

于 2010-02-18T15:51:16.290 回答