线程的interrupt

一个朋友跟我说中断指的是中断线程的阻塞状态,应该是正确的,源码解释中并没有直接指出,但是都是在讨论不同阻塞情况下调用interrupt方法产生的后果。测试运行线程调用该方法也是无效果的

中止这个线程

由当前线程中止它自己总是被允许的,除此之外checkAccess方法会被调用,这有可能导致抛出SecurityException

如果此线程是由于wait、sleep、join等方法的调用而被阻塞,那调用这个方法后,此线程的中止状态会被清空并且会获得一个InterruptedException

如果这个线程是由于java.nio.channels.InterruptibleChannel的I/O操作而阻塞的话,那这个channel会被关闭,线程的中止状态会被设置,线程会获得一个java.nio.channels.ClosedByInterruptException

如果这个线程是阻塞在java.nio.channels.Selector中,那这个线程的中止状态会被设置并且会从selection操作立即返回,也许带着一个非零值,效果就像这个selector的wakeup方法被调用

如果以上情况每一个存在,那么这个线程的中止状态被设置

中止一个not alive的线程不会产生任何影响

public void interrupt();

判断当前线程是否被中止,中止状态会被这个方法清空。换句话说如果这个方法被成功调用两次,第二次调用会返回false(除非当前线程在第一次调用这个方法清空中止状态之后且在第二次调用的检测状态之前又被中止了)

当一个线程在not alive状态下被中止是无效的可以通过调用这个方法返回false反映出来

public static boolean interrupted() 

判断这个线程是否被中止,这个方法不会对中止状态产生影响

当一个线程在not alive状态下被中止是无效的可以通过调用这个方法返回false反映出来

public boolean isInterrupted()

猜你喜欢

转载自xiaoxiaoher.iteye.com/blog/2366297
今日推荐