概述
中断代表线程状态, 每个线程都会有一个中断状态, 用boolean表示, 初始值为false, 而线程的中断其实就是修改这个中断状态为true的过程.
中断只是一个状态, 并不能决定线程的运行.
- 假设当前线程处于阻塞等待状态, 例如调用了wait()、join()、sleep()方法后, 调用线程的interrupt()方法, 此时中断状态被置为true, 线程会立马退出阻塞并抛出InterruptedException, 抛出异常后会将中断标志位重新设为false.
- 假设当前线程处于运行状态, 在调用线程的interrupt()方法后, 此时中断状态被置为true, 但是线程并不会结束运行, 需要在线程的具体执行逻辑中调用isInterrupted()检测线程中断状态, 主动响应中断.
我们来看下Thread类中有关中断操作相关的方法, 具体功能已经在代码注释中说明.
// 设置一个线程的中断状态为true
public void interrupt() {}
// 检测线程中断状态,处于中断状态返回true, 该方法不会清理中断标志位
public boolean isInterrupted() {
return isInterrupted(false);
}
// 注意⚠️:这是个静态方法,检测是否中断
// 注意⚠️:这个方法返回中断状态的同时,会将线程中断标志位重置为false
public static boolean interrupted() {
return currentThread().isInterrupted(true);
}
// native方法,ClearInterrupted表示是否清理中断标志位
private native boolean isInterrupted(boolean ClearInterrupted);
使用线程中断来终止线程运行
方法一:通过抛出InterruptedException异常来终止线程运行
public class Test1 {
public static void main(String[] args) throws Exception {
MyThread myThread = new MyThread();
myThread.start();
Thread.sleep(1000);
myThread.interrupt();
}
private static class MyThread extends Thread {
int i = 0;
@Override
public void run() {
while (true) {
System.out.println(i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
System.out.println("线程被中断, 中断状态 = " + this.isInterrupted());
return;
}
i++;
}
}
}
}
方法二:通过检测线程中断状态终止程序运行
public class Test2 {
public static void main(String[] args) throws Exception {
Thread myThread = new MyThread();
myThread.start();
Thread.sleep(1000);
myThread.interrupt();
}
private static class MyThread extends Thread {
int i = 0;
@Override
public void run() {
//while (!this.isInterrupted()) {
// System.out.println(i);
//}
while (!Thread.interrupted()) {
System.out.println(i);
}
}
}
}