关键方法
public void interrupt()
将调用线程的中断状态设置为 true
public boolean isInterrupted()
返回调用线程的中断状态
public static boolean interrupted()
1. 返回调用线程的中断状态
2. 将调用线程的中断状态设置为 false
知识储备
- sleep(),wait(),join() 会使线程进入阻塞状态
- 对进入阻塞状态的线程调用 interrupt() 时,会发生两件事:
① 使该线程进入阻塞状态的方法(sleep(),wait(),join())抛出 InterruptedException
② 将该线程的中断状态设置为 false
Demo
非阻塞线程
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
while (true) {
System.out.println("!");
}
}
});
t1.start();
// 一段时间后
t1.interrupt();
由于没有监听中断标志,线程 t1 未被中断。
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
while (!Thread.currentThread().isInterrupted()) {
System.out.println("!");
}
}
});
t1.start();
// 一段时间后
t1.interrupt();
由于监听了中断标志,线程 t1 被中断。
阻塞线程
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("!");
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
System.out.println(".");
}
}
});
t1.start();
// 一段时间后
t1.interrupt();
由于线程进入了阻塞状态,线程 t1 被中断。
特殊情况
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
while (!Thread.currentThread().isInterrupted()) {
System.out.println("!");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// 参考知识储备2,这里需要手动将该线程的中断状态设置为 true
Thread.currentThread().interrupt();
}
}
}
});
t1.start();
// 一段时间后
t1.interrupt();
当监听与阻塞组合使用时,要注意在 catch() 中手动将该线程的中断状态设置为 true。