InterruptedException
异常一般是在一个线程处于等待(像Thread.sleep()
、Object.wait()
、Thread.join()
等方法)状态时被另一个线程调用interrupt()
方法中断而抛出的。一旦捕获到InterruptedException
,Java 会自动清除该线程的中断状态。
以下代码可以说明这一点:
public class InterruptedExceptionExample {
public static void main(String[] args) {
Thread thread = new Thread(() -> {
try {
System.out.println("线程开始睡眠");
// 让线程睡眠
Thread.sleep(5000);
} catch (InterruptedException e) {
System.out.println("线程被中断,捕获到 InterruptedException");
// 检查中断状态
System.out.println("捕获异常后中断状态: " + Thread.currentThread().isInterrupted()); // false
Thread.currentThread().interrupt(); // 重新设置中断(恢复中断)
System.out.println(Thread.currentThread().isInterrupted()); // true
}
});
thread.start();
// 主线程睡眠 1 秒后中断子线程
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 中断线程
thread.interrupt();
}
}
在上述代码中,子线程开始睡眠 5 秒,主线程睡眠 1 秒后中断子线程。子线程捕获到InterruptedException
异常,然后输出捕获异常后的中断状态。由于 Java 会自动清除中断状态,所以输出的中断状态为false
,此时线程可以重新响应中断。
总的来说,当捕获InterruptedException
异常时,线程的中断状态会被自动清除,这是 Java 处理线程中断的一种机制。