【发布时间】:2011-01-18 09:27:01
【问题描述】:
当在某个线程上调用Thread.interrupt() 时,该线程会发生什么?
【问题讨论】:
-
你能说得更具体点吗?在我看来,文档对此进行了很好的讨论:java.sun.com/javase/6/docs/api/java/lang/… 我假设有些事情并不清楚,但是,如果您可以完善您的问题?
标签: java multithreading interrupt
当在某个线程上调用Thread.interrupt() 时,该线程会发生什么?
【问题讨论】:
标签: java multithreading interrupt
目标线程被“中断”。大多数情况下,该线程中设置了一个标志,该线程可以查看该标志(使用Thread.interrupted())。如果目标线程当前在某些 I/O 或 Object.wait() 上被阻塞,则它会分别被 InterruptedIOException 或 InterruptedException 唤醒。
线程中断是一种轻推线程的温和方式。它用于让线程有机会干净地退出,而不是Thread.stop(),这更像是用突击步枪射击线程。
【讨论】:
InterruptedIOException 不太可能是练习。 Solaris 中短暂启用了可中断 I/O,但这并不值得。当然,实现是特定于实现的。通常(最近)操作系统将与线程有关。
Javadoc for that method 解释了在什么情况下会发生什么。
【讨论】:
这里是 JDK 1.6 Javadoc:
中断这个线程。
除非当前线程是 中断自己,这总是 允许, checkAccess 方法 调用此线程,这可能 导致 SecurityException 为 扔了。
如果这个线程在一个 调用 wait(), wait(long), 或 wait(long, int) 的方法 对象类,或 join(), 加入(长),加入(长,整数), 睡眠(长),或睡眠(长,整数), 这个类的方法,然后它的 中断状态将被清除并 它将收到一个 中断异常。
如果此线程在 I/O 中被阻塞 可中断操作 频道 那么频道将是 关闭,线程的中断状态 将被设置,线程将 收到 ClosedByInterruptException。
如果这个线程在一个 选择器然后线程的中断 将设置状态并将返回 立即从选择 操作,可能有一个非零 值,就像选择器的 唤醒方法被调用。
如果没有上述条件 保持然后这个线程的中断 状态将被设置。
中断一个不是 活着不需要任何效果。
【讨论】:
ZeissS 是正确的,信号是最干净的方式。您还可以捕获中断异常并以这种方式进行清理。
【讨论】: