您能解释一下 java.lang.Thread.interrupt()
调用时的作用吗?
原文由 oneat 发布,翻译遵循 CC BY-SA 4.0 许可协议
您能解释一下 java.lang.Thread.interrupt()
调用时的作用吗?
原文由 oneat 发布,翻译遵循 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 许可协议
15 回答8.4k 阅读
8 回答6.2k 阅读
1 回答4k 阅读✓ 已解决
3 回答6k 阅读
3 回答2.2k 阅读✓ 已解决
2 回答3.1k 阅读
2 回答3.8k 阅读
2 回答677 阅读✓ 已解决
2 回答674 阅读✓ 已解决
2 回答1.2k 阅读✓ 已解决
2 回答679 阅读✓ 已解决
2 回答497 阅读✓ 已解决
Thread.interrupt()
设置目标线程的中断状态/标志。然后在该目标线程中运行的代码可以轮询中断状态并适当地处理它。一些阻塞的方法,例如Object.wait()
可能会立即消耗中断状态并抛出适当的异常(通常是InterruptedException
)Java 中的中断不是先发制人的。换句话说,两个线程必须合作才能正确处理中断。如果目标线程没有轮询中断状态,则中断被有效地忽略。
通过
Thread.interrupted()
方法进行轮询,该方法返回当前线程的中断状态并清除该中断标志。通常线程可能会做一些事情,比如抛出 InterruptedException。编辑(来自 Thilo 评论):一些 API 方法内置了中断处理。在我的脑海中,这包括。
Object.wait()
,Thread.sleep()
和Thread.join()
java.util.concurrent
结构InterruptedException
,而是使用ClosedByInterruptException
。编辑(出于完整性考虑,来自 @thomas-pornin 对 完全相同问题 的回答)
线程中断是轻推线程的一种温和方式。它用于让线程有机会 干净地 退出,而不是
Thread.stop()
更像是用突击步枪射击线程。