java线程中断是协作机制而非强制终止:interrupt()仅设中断标记,isinterrupted()只读不改状态,interrupted()查后即清;中断状态仅在抛interruptedexception、调用interrupted()或线程自然终止时被清除。

Java线程中断不是“杀死”线程的指令,而是一套协作通知机制:调用 interrupt() 只是打个标记,后续是否响应、何时退出、如何清理,全由被中断线程自己决定。关键在于三个方法的行为差异和中断状态(interrupt status)的清除时机。
interrupt():仅设标记,不终止也不清状态
这是实例方法,作用单一:将目标线程的中断状态设为 true。无论线程处于运行中还是阻塞中,该操作都只是设置标志位。
- 若线程正在执行普通代码(如循环计算),调用后
isInterrupted()立即返回 true,但线程继续跑,除非它主动检查并退出 - 若线程正处在可中断的阻塞状态(
sleep()、wait()、join()、LockSupport.park()等),则立即被唤醒,并抛出InterruptedException;此时 JVM 会自动将其中断状态清为 false
isInterrupted():查状态,不碰标记
这也是实例方法,只读不写。它返回调用对象当前的中断状态值,且绝不修改该状态。
- 适用于检查其他线程是否被请求中断,比如主线程轮询子线程:
if (worker.isInterrupted()) { cleanup(); return; } - 多次调用结果一致,只要中间没被其他操作(如抛异常或调用
interrupted())清除过状态
interrupted():查+清,仅限当前线程
这是静态方法,专用于检查当前线程自身的中断状态,且在返回结果的同时,把该线程的中断状态强制设为 false。
- 第一次调用返回当前真实状态(true 或 false),第二次紧接着调用必返回 false(除非期间又被中断)
- 典型用法是在
catch(InterruptedException)块末尾补一句Thread.currentThread().interrupt();,把被 JVM 清掉的状态重新设上,避免中断信号“丢失” - 不能用来检查别的线程——它没有参数,只能作用于当前线程
中断状态何时被清除?三条明确路径
中断状态从 true 变回 false,只有以下三种情况:
- 线程在可中断阻塞方法中抛出
InterruptedException(JVM 自动清除) - 显式调用
Thread.interrupted()(静态方法,查完即清) - 线程自然终止(run 方法执行完毕)
注意:isInterrupted() 永远不会清除;interrupt() 永远不会清除(只会设为 true);未抛异常的运行中线程,其中断状态一旦设为 true,就会一直保持,直到上述任一清除动作发生。










