Thread.interrupted()是唯一检查并清除当前线程中断状态的静态方法,返回true表示此前被中断且已重置标志位;isInterrupted()为实例方法,仅查询不修改状态。

Thread.interrupted() 是 Java 中唯一一个**检查并清除当前线程中断状态**的静态方法。它直接作用于当前正在执行的线程(即 Thread.currentThread()),返回 true 表示该线程此前被中断过(且此时会将中断标志位重置为 false),否则返回 false。
为什么用 interrupted() 而不是 isInterrupted()
isInterrupted() 是实例方法,只查状态、不改变状态;而 interrupted() 是静态方法,专为“检测后立即响应并清理”设计——这符合中断机制的设计哲学:中断是协作式信号,一旦被处理(比如跳出循环、抛出异常),就不应反复触发相同逻辑。
- 多次调用
interrupted():第一次可能返回true,第二次几乎总是false(除非中间又被其他线程再次中断) - 它不抛异常,也不阻塞,纯属状态查询 + 清除,适合放在循环条件或关键路径中主动轮询
典型使用场景:可中断的忙等待或长循环
当线程在执行耗时但非阻塞的操作(如计算、IO 轮询、自旋等待)时,需定期检查中断以实现及时退出:
while (!Thread.interrupted()) {
// 执行一段工作
doSomeWork();
// 可选:避免过度占用 CPU,短暂让出
Thread.yield();
}
注意:循环体内部若调用可能抛 InterruptedException 的方法(如 sleep(), wait(), join()),应捕获该异常并通常选择退出或重新设置中断(见下一点)。
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
立即学习“Java免费学习笔记(深入)”;
配合 InterruptedException 处理:中断传播与恢复
阻塞方法被中断时会清中断标志并抛出 InterruptedException。若你捕获了它但不想立即终止线程(例如需做清理),应显式恢复中断状态:
- 错误做法:捕获后什么也不做 → 中断信号丢失
- 正确做法:在
catch块末尾调用Thread.currentThread().interrupt(),把标志位设回去 - 这样后续的
interrupted()或其它阻塞调用才能继续响应
常见误区提醒
不要误用对象引用调用 interrupted() —— 它是静态方法,写成 someThread.interrupted() 编译通过但实际检查的是当前线程,不是 someThread。
也不要把它和 Thread.currentThread().isInterrupted() 混淆:后者不改状态,适合“只读”判断(如日志记录、监控);前者是“读+清”,用于控制流程分支。

















