(1)interrupt:
调用interrupt()方法来停止线程,不会马上终止,它仅仅是在当前的线程中打了一个停止的标记。即不会影响线程的正常运行,只是该线程多了一个停止的标记而已。
(2)interrupted:
测试的是当前线程是否处于中断状态,是一个静态方法,在一次执行后具有将状态标志清除为false的状态。即连续两次调用该方法后,第二次调用则会返回false。源码如下:
(3)isInterrupted:
测试的是调用该方法的线程是否处于中断状态,是一个实例方法,不会清除状态标志。源码如下:
实例:
MyThread1.java
public class MyThread1 extends Thread{
// @Override
public void run(){
super.run();
for(int i=0;i<500000;i++){
System.out.println("i="+(i+1));
}
}
}
Run1.java
写了一下代码进行测试。
public class Run1 {
public static void main(String[] args){
/*
* 此程序里面有3个线程,即thread,t1和main.
*
*/
MyThread1 thread=new MyThread1();
Thread t1=new Thread(thread);
thread.start();
t1.start();
try {
Thread.sleep(1000);
System.out.println(Thread.currentThread().getName());
//thread.interrupt();
//t1.interrupt();
//Thread.currentThread().interrupt();
System.out.println("是否停止0?"+Thread.currentThread().interrupted());
System.out.println("是否停止1?"+thread.interrupted());
System.out.println("是否停止2?"+thread.isInterrupted());
System.out.println("是否停止3?"+t1.interrupted());
System.out.println("是否停止4?"+t1.isInterrupted());
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("end");
}
}
(1)此时没有任何的中断,所以输出结果均为false。
(2)若把Thread.currentThread().interrupt();加到代码中,结果为0为true,1,2,3和4为false。首先,因为interrupted()测试的是当前线程的状态,而当前线程的状态已经发生了中断,所以为true,但是又因为interrupted()有清除状态的功能,所以其他调用该方法的结果都是false。
(3)若把thread.interrupt();加到代码中,结果为0,1,3,4是false,2为true。因为isInterrupted()测试的是调用该方法的线程的状态。因此只有2为true。
(4)若把t1.interrupt()加到代码中,结果为0,1,2,3为false,4为true。原因同上。