Thread.interrupted() 是静态方法,检查并立即清除当前线程中断状态;因Java中断为协作式机制,重置可避免重复响应、确保“消费一次即失效”,常用于循环中轮询检测中断。

Thread.interrupted() 是一个静态方法,用于检查当前线程是否被中断,并在检查后**立即清除(重置)中断状态**。它不作用于传入的线程对象,只对调用它的线程本身有效。
为什么需要“检查并重置”?
Java 的中断机制是协作式的:设置中断标志只是发信号,线程需主动响应。多次调用 interrupt() 不会累积效果,但若不清理状态,后续调用 isInterrupted() 或再次 interrupted() 可能误判。重置可避免重复处理同一中断信号,也符合“消费一次即失效”的设计意图。
典型使用场景:循环中响应中断
在长时间运行的循环(如 while(true))中,应定期检查中断状态,及时退出:
- 在循环条件中直接使用 Thread.interrupted(),既判断又清空状态
- 若检查返回 true,说明已被中断,应跳出循环或执行清理逻辑
- 不要在循环体里反复调用 isInterrupted() —— 它不重置,可能造成无限响应
示例:
while (!Thread.interrupted()) {
// 执行任务...
doWork();
// 可能阻塞的操作(如 sleep、wait、join)会抛 InterruptedException
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// 阻塞中被中断:JVM 自动清除了中断状态,需手动恢复(可选)
Thread.currentThread().interrupt(); // 保留中断信号给上层处理
break;
}
}
注意 interrupt() 和 interrupted() 的区别
- thread.interrupt():对指定线程设置中断标志(不重置)
- Thread.interrupted():仅对当前线程生效;返回当前中断状态,并**清空标志位**
- thread.isInterrupted():对任意线程查询,**不改变**其中断状态
常见误区与建议
- 不要用 Thread.interrupted() 判断其他线程——它只看当前线程
- 捕获 InterruptedException 后,除非明确要吞掉中断,否则推荐调用 Thread.currentThread().interrupt() 恢复状态
- 在非阻塞逻辑中,用 Thread.interrupted() 做“轮询式中断检测”最安全
- 避免在 finally 块中无条件调用它——可能意外清空本该传递出去的中断信号










