interrupt() interrupted() isInterrupted()

    技术2022-07-11  99

    interrupt() 是给线程设置中断标志,线程仍会继续运行interrupted() 是检测中断并清除中断状态,第二次再调用时中断状态已被清除,将返回一个 falseisInterrupted() 只检测中断,不清除中断状态 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
    Processed: 0.036, SQL: 9