首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java.lang.Thread.interrupt()做了什么?

java.lang.Thread.interrupt()做了什么?
EN

Stack Overflow用户
提问于 2010-08-28 16:09:05
回答 9查看 154K关注 0票数 240

你能解释一下java.lang.Thread.interrupt()在调用时会做什么吗?

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2010-08-28 16:12:18

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

Java中的中断不是抢占式的。换句话说,为了正确处理中断,两个线程都必须协作。如果目标线程没有轮询中断状态,那么中断实际上会被忽略。

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

编辑(来自Thilo注释):一些API方法内置了中断处理。我的头顶,这包括。

  • Object.wait()Thread.sleep()和structures
  • Java ClosedByInterruptException.

Thread.sleep()(但不是java.io),并且它不使用InterruptedException,而是使用ClosedByInterruptException.

编辑(来自@thomas-porninexactly same question的回答,以确保完整性)

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

票数 274
EN

Stack Overflow用户

发布于 2010-08-28 16:20:06

什么是中断?

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

它是如何实现的?

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

来自 Thread.interrupt() API(http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#interrupt(%29)报价

会中断此线程。首先调用此线程的checkAccess方法,这可能导致抛出SecurityException。

如果此线程在调用Object类的wait()、wait(long)或wait(long,int)方法,或调用此类的join()、join(long)、join(long,int)、sleep(long)或sleep(long,int)方法时被阻塞,则其中断状态将被清除,并将收到InterruptedException。

如果该线程在可中断通道上的I/O操作中被阻塞,则该通道将被关闭,该线程的中断状态将被设置,并且该线程将接收ClosedByInterruptException。

如果这个线程在Selector中被阻塞,那么线程的中断状态将被设置,并且它将立即从选择操作返回,可能返回一个非零值,就像调用选择器的唤醒方法一样。

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

要完全理解相同的内容,请查看本文:

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

票数 78
EN

Stack Overflow用户

发布于 2010-08-28 16:12:37

如果目标线程一直在等待(通过调用wait()或其他一些实际上做同样事情的相关方法,比如sleep()),它将被中断,这意味着它不再等待它正在等待的东西,而是接收一个InterruptedException。

在这种情况下,完全由线程本身(调用wait()的代码)决定要做什么。它不会自动终止线程。

它有时与终止标志结合使用。当中断时,线程可以检查这个标志,然后关闭自己。但再说一次,这只是一个约定。

票数 20
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3590000

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档