在某个线程上调用Thread.interrupt()时会发生什么?

在某个Thread.interrupt()上调用Thread.interrupt()时,该线程会发生什么?

目标线程被“中断”。 大多数情况下,在该线程中设置一个标志,线程可以查看该标志(使用Thread.interrupted() )。 如果目标线程当前在某些I / O或Object.wait()上被阻塞,则它分别被InterruptedIOExceptionInterruptedException唤醒。

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

该方法的Javadoc解释了在什么情况下会发生什么。

这是JDK 1.6 Javadoc :

中断此线程。

除非当前线程正在中断自身(始终允许),否则将调用此线程的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中被阻塞,则线程的中断状态将被设置,并且它将立即从选择操作返回,可能具有非零值,就像调用选择器的唤醒方法一样。

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

中断不活动的线程不会产生任何影响。

ZeissS是正确的,信号是最干净的方式。 你也可以捕获中断exception并清理那种方式。