Java多线程的中断原理和 interrupt() 几个方法简介

Posted shen-qian

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java多线程的中断原理和 interrupt() 几个方法简介相关的知识,希望对你有一定的参考价值。

        上节讲到,线程被 wait() 通知后进入等待池,可以由本线程的 interrupt() 方法解救,使本线程可以去重新竞争锁等等。是如何实现的呢?

        实际上,中断仅仅是在线程对象做一个标记而已,称为中断标志。中断标志默认为false,在线程 t 调用自己的 t.interrupt() 方法后,中断标志就变成true。但是,中断标志为true实际上不会对正常运行的线程产生影响,因为正常运行的线程不会自己去检查自己的中断标志。

        只有那些被阻塞的线程才会不停的检查自己的中断标志,这个阻塞包括因 wait、join、yield、而进入阻塞的线程,这些被阻塞的线程如果检查到自己的中断标志为true,就会抛出InterruptException异常。

 

 

        在线程正常运行时,也可以通过中断标志做一些事情,比如利用它做分支条件、循环退出条件等。对于线程 t ,可以用 t.isInterrupted() 获取 t 的中断标志为 true or false。

public void run()        
      if(Thread.currentThread().isInterrupted())
         System.out.println("0"); 
      
      else 
         System.out.println("1");
      

 

        另外,还有Thread的静态方法 Interrupted() 方法也可以返回中断标志的状态,但是这个方法在返回结果外还会清除线程的中断标志,也就是把false置为true。而且需要注意的是 Interrupted() 作用的对象是当前运行的线程,而不是调用它的对象,毕竟它是个静态方法。例如:

       

Class Test 
     public static void main(String [] args) 
         Thread t = new Thread();
          t.Interrupted();
     

      t.Interrupted() 作用的不是线程对象 t ,而是 main 线程。

 

以上是关于Java多线程的中断原理和 interrupt() 几个方法简介的主要内容,如果未能解决你的问题,请参考以下文章

Java 多线程基础interrupt()和线程终止方式

关于Java多线程-interrupt()interrupted()isInterrupted()解释

Java学习-073-多线程06:线程中断 interrupt()

java多线程 interrupt(), interrupted(), isInterrupted()方法区别

java 多线程5: java 终止线程及中断机制 (stop()interrupt() interrupted()isInterrupted())

从头认识java-17.2 线程中断(interrupt)