测试
public class InterruptTest {
public static void main(String[] args) throws InterruptedException {
test1();
// test2();
}
public static void test1() throws InterruptedException {
Thread thread = new Thread(() -> {
//非阻塞时调用中断方法,会把interrupted()置为true,Thread.interrupted()获取该状态位后会重置为false
while (!Thread.interrupted()) {
System.out.println("测试");
try {
Thread.sleep(100);
} catch (Exception e) {
//阻塞时调用中断方法,会抛出InterruptedException,但不会把interrupted()置为true,所以用Thread.interrupted()判断无效
System.out.println("线程被中断");
break;
}
}
});
thread.start();
Thread.sleep(1000);
thread.interrupt();
}
public static void test2() throws InterruptedException {
Thread thread = new Thread(() -> {
while (true) {
System.out.println("测试");
try {
Thread.sleep(100);
} catch (Exception e) {
System.out.println("线程被中断");
}
}
});
thread.start();
Thread.sleep(1000);
thread.interrupt();
}
}
结论
通过测试发现,Thread的interrupt方法被调用时会有两种表现:
方法阻塞时(sleep, wait, join等状态),那么线程将立即退出被阻塞状态,并抛出一个InterruptedException异常。
方法未阻塞时(正常运行),那么会将该线程的中断标志设置为 true(可用Thread.interrupted()获取该状态),被设置中断标志的线程将继续正常运行,不受影响。
Thread的interrupt方法并不会直接造成方法中断