interrupt() interrupted() isInterrupted()

  • interrupt() 是给线程设置中断标志,线程仍会继续运行
  • interrupted() 是检测中断并清除中断状态,第二次再调用时中断状态已被清除,将返回一个 false
  • isInterrupted() 只检测中断,不清除中断状态
    interrupted() 作用于当前线程(主线程),interrupt(),isInterrupted() 作用于此线程,即代码中调用此方法的实例所代表的线程
public class InterruptTest {

    public static void main(String[] args) {
        MyThread1 thread = new MyThread1();
        thread.start();
        thread.interrupt();
        System.out.println("第一次调用thread.isInterrupted():"+thread.isInterrupted());
        System.out.println("第二次调用thread.isInterrupted():"+thread.isInterrupted());
        //测试interrupted()函数
        System.out.println("第一次调用thread.interrupted():"+thread.interrupted());
        System.out.println("第二次调用thread.interrupted():"+thread.interrupted());
        System.out.println("thread是否存活:"+thread.isAlive());

    }

}

class MyThread1 extends Thread{
    public void run(){
        for(int i=0;i<10;i++){
            System.out.println("i="+(i+1));
        }
    }
}

输出结果:

第一次调用thread.isInterrupted()true
第二次调用thread.isInterrupted()true
第一次调用thread.interrupted()false
第二次调用thread.interrupted()false
thread是否存活:true
i=1
i=2
i=3
i=4
i=5
i=6
i=7
i=8
i=9
i=10

从输出结果看,可能会有疑惑,为什么后面两个interrupted方法输出的都是false,而不是预料中的一个true一个false
interrupted() 方法测试的是当前线程是否被中断,当前线程 !!!这里当前线程是 main线程,而thread.interrupt()中断的是thread线程,这里的此线程就是thread线程,所以当前线程main从未被中断过
尽管interrupted()方法是以thread.interrupted()的形式被调用,但它检测的仍然是main线程而不是检测thread线程,所以 thread.interrupted() 在这里相当于 main.interrupted()
对于这点,下面我们修改进行测试

Thread.currentThread()函数可以获取当前线程,下面代码中获取的是main线程

public class InterruptTest {
   public static void main(String[] args ) throws InterruptedException {
      Thread.currentThread().interrupt();
      System.out.println("第一次调用Thread.currentThread().interrupt():"+Thread.currentThread().isInterrupted());
      System.out.println("第一次调用thread.interrupted():"+Thread.currentThread().interrupted());
      System.out.println("第二次调用thread.interrupted():"+Thread.currentThread().interrupted());
   }
}

这里都是针对当前线程在操作,如果 interrupted() 方法有检测中断并清除中断状态的作用,预料中的输出应该是true-true-false,实际输出如下:

第一次调用 Thread.currentThread().interrupt():true
第一次调用 thread.interrupted(): true
第二次调用 thread.interrupted(): false

结果证明猜想是正确的


若果想要是实现调用 interrupt()方法 真正的终止线程,则可以在线程的 run()方法中做处理即可,比如直接跳出 run()方法 使线程结束,视具体情况而定,下面是一个例子

public class MyThread extends Thread {
   public  void run() {
      for (int i = 0; i < 1000; i++) {
         System.out.println("i="+(i+1));
         if(this.isInterrupted()){
            System.out.println("通过this.isInterrupted()检测到中断");
            System.out.println("第一个interrupted()"+this.interrupted());
            System.out.println("第二个interrupted()"+this.interrupted());
            break;
         }
      }
      System.out.println("因为检测到中断,所以跳出循环,线程到这里结束,因为后面没有内容了");
   }
}

测试MyThread

public class InterruptTest {
   public static void main(String[] args ) throws InterruptedException {
      MyThread myThread=new MyThread();
      myThread.start();
      myThread.interrupt();
      //sleep等待一秒,等myThread运行完
      Thread.currentThread().sleep(1000);
      System.out.println("myThread线程是否存活:"+myThread.isAlive());
   }
}

输出结果:

i=1
通过 this.isInterrupt()检测到中断
第一个 interrupt() true
第二个 interrupt() false
因为检测到中断,所以跳出循环,线程到这里结束,因为后面没有内容了
myThread 线程是否存活:false
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章