- 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