Java_多线程之interrupt()

转载大佬的https://www.cnblogs.com/skywang12345/p/3479949.html、

特别好。

补充:又发现了另一位大佬的博客https://www.cnblogs.com/death00/p/11585028.html

自己的一点理解:

最终作用是中断线程。

  • Thread.interrupt(),设置当前中断标记为true
  • Thread对象.isInterrupted(),检测当前线程对象的中断标记
  • Thread.interrupted(),检测当前的中断标记,然后重置中断标记为false
    因此interrupt中断机制并不是真正的将当前线程中断,而是一个中断标记的变化

1.首先API:

interrupt()的作用是中断本线程。
本线程中断自己是被允许的;其它线程调用本线程的interrupt()方法时,会通过checkAccess()检查权限。这有可能抛出SecurityException异常。
如果本线程是处于阻塞状态:调用线程的wait(), wait(long)或wait(long, int)会让它进入等待(阻塞)状态,或者调用线程的join(), join(long), join(long, int), sleep(long), sleep(long, int)也会让它进入阻塞状态。若线程在阻塞状态时,调用了它的interrupt()方法,那么它的“中断状态”会被清除并且会收到一个InterruptedException异常。例如,线程通过wait()进入阻塞状态,此时通过interrupt()中断该线程;调用interrupt()会立即将线程的中断标记设为“true”,但是由于线程处于阻塞状态,所以该“中断标记”会立即被清除为“false”,同时,会产生一个InterruptedException的异常。
如果线程被阻塞在一个Selector选择器中,那么通过interrupt()中断它时;线程的中断标记会被设置为true,并且它会立即从选择操作中返回。
如果不属于前面所说的情况,那么通过interrupt()中断线程时,它的中断标记会被设置为“true”。
中断一个“已终止的线程”不会产生任何操作。

interrupt()只是发出中断信号,并不能立刻结束线程。

所以对于一个线程处于阻塞状态,通过interrupt()中断,刚开始为立即将中断标记设为"true",但由于抛异常它的中断标记最终会被设置为“false”。同时,会产生一个InterruptedException的异常。通过捕获这个异常进行结束

其次对于一个运行状态的线程,那么通过interrupt()中断线程时,它的中断标记会被设置为“true”。所以配合Thread对象.isInterrupted()进行结束

即可。

总而言之结合两种情况,最终要实现中断所有线程可以在这样:

@Override
public void run() {
    try {
        // 1. isInterrupted()保证,只要中断标记为true就终止线程。
        while (!isInterrupted()) {
            // 执行任务...
        }
    } catch (InterruptedException ie) {  
        // 2. InterruptedException异常保证,当InterruptedException异常产生时,线程被终止。
    }
}

 

你可能感兴趣的:(Java基础)