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() 的核心差异)。
阅读全文