输出结果:
第一次调用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