interrupted、interrupt、isInterrupted三者关系如何界定?
摘要:interrupted、interrupt、isInterrupted 三者关系全解析 在 Java 线程中断机制中,interrupt()、interrupted()、isInterrupted() 是核心且极易混淆的三个方法,它们围绕线
interrupted、interrupt、isInterrupted 三者关系全解析
在 Java 线程中断机制中,interrupt()、interrupted()、isInterrupted() 是核心且极易混淆的三个方法,它们围绕线程中断标志位工作,但职责、行为、调用方式完全不同。下面从「核心概念→方法拆解→对比→实战场景」层层讲透。
一、先理解核心:线程中断标志位
Java 中的“中断”不是强制终止线程,而是给线程设置一个布尔类型的中断标志位(线程内部的一个状态):
线程本身可以感知这个标志位,决定是否停止执行(是“协作式”而非“强制式”);
当线程处于 sleep()、wait()、join() 等阻塞状态时,若被中断,会抛出 InterruptedException,并清除中断标志位(标志位变回 false);
三个方法的核心区别,本质是对这个标志位的「设置」「查询」「查询并清除」的不同操作。
二、逐个拆解三个方法
1. interrupt():设置中断标志位(核心动作)
核心定义
public void interrupt()
属于 Thread 类的实例方法,作用是给目标线程设置中断标志位为 true(仅设置标志,不直接终止线程)。
关键特性
调用方式:通过线程对象调用(如 thread.interrupt()),作用于该线程;
特殊场景:若目标线程正处于阻塞状态(sleep/wait/join),会立即抛出 InterruptedException,并清除中断标志位(标志位变回 false);
无返回值:仅执行“设置标志”动作,不返回任何结果。
示例代码
public class InterruptDemo {
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(() -> {
// 循环检测中断标志位
while (!Thread.currentThread().isInterrupted()) {
System.out.println("线程运行中...");
try {
Thread.sleep(500); // 阻塞状态
} catch (InterruptedException e) {
System.out.println("捕获到中断异常,此时标志位:" + Thread.currentThread().isInterrupted());
// 若想让线程退出,需手动再次设置中断标志(因为异常会清除标志)
Thread.currentThread().interrupt();
}
}
System.out.println("线程退出,最终标志位:" + Thread.currentThread().isInterrupted());
});
t1.start();
Thread.sleep(2000); // 主线程等待2秒
t1.interrupt(); // 给t1设置中断标志
}
}
输出结果:
线程运行中...
线程运行中...
线程运行中...
捕获到中断异常,此时标志位:false
线程退出,最终标志位:true
2. isInterrupted():查询中断标志位(不清除)
核心定义
public boolean isInterrupted()
属于 Thread 类的实例方法,作用是查询目标线程的中断标志位状态,不会修改标志位。
关键特性
调用方式:通过线程对象调用(如 thread.isInterrupted());
返回值:true(已中断)/ false(未中断);
核心区别:仅查询,不改变标志位状态(这是和 interrupted() 的核心差异)。
