你能解释一下java.lang.Thread.interrupt()在调用时会做什么吗?
发布于 2010-08-28 16:12:18
Thread.interrupt()设置目标线程的中断状态/标志。则在该目标线程中运行的代码可以轮询中断状态并适当地处理它。某些阻塞的方法(如Object.wait() )可能会立即使用中断状态并抛出适当的异常(通常为InterruptedException)
Java中的中断不是抢占式的。换句话说,为了正确处理中断,两个线程都必须协作。如果目标线程没有轮询中断状态,那么中断实际上会被忽略。
轮询通过Thread.interrupted()方法进行,该方法返回当前线程的中断状态并清除该中断标志。通常情况下,线程可能会做一些事情,比如抛出InterruptedException。
编辑(来自Thilo注释):一些API方法内置了中断处理。我的头顶,这包括。
Object.wait(),Thread.sleep()和structuresClosedByInterruptException. Thread.sleep()(但不是java.io),并且它不使用InterruptedException,而是使用ClosedByInterruptException.
编辑(来自@thomas-pornin对exactly same question的回答,以确保完整性)
线程中断是一种轻推线程的温和方式。它用于给线程一个干净退出的机会,而不是Thread.stop(),它更像是用突击步枪射击线程。
发布于 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
发布于 2010-08-28 16:12:37
如果目标线程一直在等待(通过调用wait()或其他一些实际上做同样事情的相关方法,比如sleep()),它将被中断,这意味着它不再等待它正在等待的东西,而是接收一个InterruptedException。
在这种情况下,完全由线程本身(调用wait()的代码)决定要做什么。它不会自动终止线程。
它有时与终止标志结合使用。当中断时,线程可以检查这个标志,然后关闭自己。但再说一次,这只是一个约定。
https://stackoverflow.com/questions/3590000
复制相似问题