java.lang.Thread.interrupt() 有什么作用?

新手上路,请多包涵

您能解释一下 java.lang.Thread.interrupt() 调用时的作用吗?

原文由 oneat 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 597
2 个回答

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

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

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

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

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

编辑(出于完整性考虑,来自 @thomas-pornin完全相同问题 的回答)

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

原文由 Mike Q 发布,翻译遵循 CC BY-SA 4.0 许可协议

什么是中断?

中断是对线程的指示,它应该停止正在做的事情并做其他事情。由程序员决定线程如何准确响应中断,但线程终止是很常见的。

它是如何实施的?

中断机制是使用称为中断状态的内部标志实现的。调用 Thread.interrupt 设置此标志。当线程通过调用静态方法 Thread.interrupted 检查中断时,中断状态被清除。一个线程用来查询另一个线程的中断状态的非静态 Thread.isInterrupted 不会更改中断状态标志。

引用自 Thread.interrupt() API

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

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

检查一下以完全了解相同的内容:

http://download.oracle.com/javase/tutorial/essential/concurrency/interrupt.html

原文由 YoK 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题