Thread.java类里提供了两种方法

(1)this.interrupted():测试当前线程是否已经中断。

(2)this.isInterrupted():测试线程是否已经中断。

interrupted()方法声明如下;

public static boolean interrupted()



isInterrupted()方法声明如下:

public boolean isInterrupted()



我们先来看看this.interrupted()方法的解释:测试当前线程是否已经中断,当前线程是指运行this.interrupted方法的线程。我们代码来试验一下:

class MyThread extends Thread{
	@Override
    public void run() {
		super.run();
		for(int i=0;i<50000;i++) {
			System.out.println("i="+(i+1));
		}
	}
}
public class Run {
	public static void main(String[] args) {
		try {
			MyThread thread=new MyThread();
			thread.start();
			Thread.sleep(1000);
			thread.interrupt();//停止thread对象所代表的对象
			System.out.println("是否停止1?="+thread.interrupted());//判断thread对象所代表的线程是否停止
			System.out.println("是否停止2?="+thread.interrupted());//判断thread对象所代表的线程是否停止
		}catch(InterruptedException e) {
			System.out.println("main catch");
			e.printStackTrace();
		}
		System.out.println("end!");
	}
}

可以看出线程并未停止,这就证明了interrupted()的解释:测试当前线程是否已经中断。这个当前线程是main,他从未中断过。

那么再看下面的代码;

class MyThread extends Thread{
	@Override
    public void run() {
		super.run();
		for(int i=0;i<500000;i++) {
			System.out.println("i="+(i+1));
		}
	}
}
public class Run {
	public static void main(String[] args) {
		Thread.currentThread().interrupt();//停止thread对象所代表的对象
		System.out.println("是否停止1?="+Thread.interrupted());//判断thread对象所代表的线程是否停止
		System.out.println("是否停止2?="+Thread.interrupted());//判断thread对象所代表的线程是否停止
		System.out.println("end!");
	}
}



输出结果为:

是否停止1?=true
是否停止2?=false
end!

从上述结果来看,方法interrupted()的确判断出当前线程是否是停止状态。但是为啥第二个布尔值是false?查看官方文档中对interrupted()方法的解释;

测试当前线程是否已经中断。线程的中断状态由该方法清除。换句话说,如果连续两次调用该方法,则第二次调用将返回false(第一次调用已清除了其中断状态后,且在第二次调用检验完中断状态前,当前线程再次中断的情况除外。)

所以interrupted方法具有清除状态的功能,所以第二次调用后返回的值为false。

下面再来介绍isInterrupted()方法。

class MyThread extends Thread{
	@Override
    public void run() {
		super.run();
		for(int i=0;i<55000;i++) {
			System.out.println("i="+(i+1));
		}
	}
}
public class Run {
	public static void main(String[] args) {
		try {
			MyThread thread=new MyThread();
			thread.start();
			Thread.sleep(1000);
			thread.interrupt();
			System.out.println("是否停止1?="+thread.isInterrupted());//判断thread对象所代表的线程是否停止
			System.out.println("是否停止2?="+thread.isInterrupted());//判断thread对象所代表的线程是否停止
		}
		catch(InterruptedException e) {
			System.out.println("mian catch");
			e.printStackTrace();
		}
		System.out.println("end!");
	}
}



部分输出结果为;

i=54999
i=55000
是否停止1?=false
是否停止2?=false
end!

可以看出,此方法并未清除状态标志。

在最后再来看下这两个方法的解释:

(1)this.interrupted():测试当前线程是否已经是中断状态,执行后具有将状态标志清楚为false的功能。

(2)this.isInterrupted():测试当前线程Thread对象是否已经是中断状态,但不清除状态标志。