Java中interrupt() interrupted() isInterrupted()辨析:
- interrupt()是将线程的中断标记设置为true,但不会停止线程。在中断状态下如果线程处于阻塞状态(即调用了sleep(),wait(),join()方法)就会产生一个InterruptedException,并且由于线程处于阻塞状态,所以该中断标记立即清除为false
- interrupted()是测试当前线程是否处于中断状态,是返回true,并且调用后会立即将该中断标记清除为false
public static boolean interrupted() {
return currentThread().isInterrupted(true);//其中本地方法isInterrupted()中参数true表示是否清除状态位
}
private native boolean isInterrupted( boolean ClearInterrupted);
- isInterrupted()是作用于调用该方法的线程对象所对应的线程(线程对象对应的线程不一定是当前运行的线程),调用后不会清除中断标记
public boolean isInterrupted() {
return isInterrupted(false);
}
具体实例:
- 阻塞过后,中断标记的清除:
public class TestInterrupt {
public static void main(String[] args) {
System.out.println("主线程开始。。");
Thread.currentThread().interrupt();
try {
Thread.sleep(1000);//会抛出异常
} catch (InterruptedException e) {
System.err.println("sleep方法出现了异常");
}
//线程阻塞后,中断状态被清除为false
System.out.println("主线程是否处于中断状态:" + Thread.currentThread().isInterrupted());//false
System.out.println("主线程结束。。");
}
}
/*
结果:
主线程开始。。
sleep方法出现了异常
主线程是否处于中断状态:false
主线程结束。。
*/
- 使用isInterrupt(),不会清除中断标记:
public class TestIsInterrupt {
public static void main(String[] args) {
System.out.println("主线程开始。。");
Thread.currentThread().interrupt();
System.out.println("主线程是否处于中断状态:" + Thread.currentThread().isInterrupted());//true
System.out.println("主线程是否处于中断状态:" + Thread.currentThread().isInterrupted());//true
System.out.println("主线程结束。。");
}
}
/*
结果:
主线程开始。。
主线程是否处于中断状态:true
主线程是否处于中断状态:true
主线程结束。。
*/
- 使用interrupt(),会清除中断标记:
public class TestInterrupt {
public static void main(String[] args) {
System.out.println("主线程开始。。");
Thread.currentThread().interrupt();
System.out.println("主线程是否处于中断状态:" + Thread.interrupted());//true
System.out.println("主线程是否处于中断状态:" + Thread.interrupted());//false
System.out.println("主线程结束。。");
}
}
/*
结果:
主线程开始。。
主线程是否处于中断状态:true
主线程是否处于中断状态:false
主线程结束。。
*/