首先看一下中文解释及API实现:
1) interrupted():测试当前线程是否已中断。
public static boolean interrupted() {
return currentThread().isInterrupted(true);
}
是静态方法,属于类。
2)isInterrupted():测试线程是否已中断
public boolean isInterrupted() {
return isInterrupted(false);
}
是非静态方法,属于对象。
代码测试1:
public class MyThread extends Thread {
@Override
public void run() {
super.run();
System.out.println("我是线程中的方法,已经执行了!");
}
}
public class TestRun {
public static void main(String[] args) {
try {
MyThread myThread = new MyThread();
myThread.start();
Thread.sleep(1000);
myThread.interrupt();
System.out.println("是否停止1(静态)? =" + Thread.interrupted() );
System.out.println("是否停止2(静态)? =" + Thread.interrupted() );
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
结果:
interrupted()方法的确是测试当前线程是否中断,此时,“当前线程”是main,它没有中断,故结果是false。
代码测试2:
将上述TestRun类中的main代码进行修改,如下,
public class TestRun {
public static void main(String[] args) {
Thread.currentThread().interrupt();
System.out.println("是否停止1(静态)? =" + Thread.interrupted() );
System.out.println("是否停止2(静态)? =" + Thread.interrupted() );
System.out.println("结束!");
}
结果:
第一个是true,第二个是false,why?
测试当前线程是否中断。 该方法可以清除线程的中断状态 。 换句话说,如果这个方法被连续调用两次,那么第二个调用将返回false(除非当前线程再次中断,在第一个调用已经清除其中断状态之后,在第二个调用之前已经检查过)。
interrupted()方法具有清除状态的功能,所以第二次调用返回值是false。
再来看另外一个方法,isInterrupted():
public class MyThread extends Thread {
@Override
public void run() {
super.run();
for(int i=0; i<500000; i++){
if(this.isInterrupted()){
break;
}
System.out.println("i=" + (i+1));
}
System.out.println(Thread.currentThread().getName() + "线程即将停止!");
}
}
public class TestRun {
public static void main(String[] args) {
try {
MyThread myThread = new MyThread();
myThread.start();
Thread.sleep(1000);
myThread.interrupt();
System.out.println("是否停止1(非静态)? =" + myThread.isInterrupted() );
System.out.println("是否停止2(非静态)? =" + myThread.isInterrupted() );
System.out.println("结束!");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
运行结果如下:
此时,两次输出都是true,故说明isInterrupted()方法不会清除状态标志。
总结:
1、Thread.interrupted():测试当前线程是否已经是中断状态,执行该方法后具有将状态标志清除为false的功能。
2、this.isInterrupted():测试线程对象是否已经是中断状态,但是不会清除状态标志。