isinterrupted()不改变中断标志位,interrupted()会清除当前线程中断标志位;前者是实例方法可查任意线程,后者是静态方法仅查当前线程且查后即清。

Java 线程的中断标志位(interrupt status)不会自动清除,但两个方法的行为差异关键在于:`isInterrupted()` 是实例方法,**不改变**标志位;`interrupted()` 是静态方法,**会清除**当前线程的中断标志位(即调用后立即重置为 false)。
isInterrupted():只读,不清理
该方法查询调用对象(某个线程实例)的中断状态,返回 true 或 false,且**不影响**该线程的中断标志位。即使多次调用,只要没被其他操作清除(如 `interrupted()` 或抛出 `InterruptedException`),结果始终一致。
- 适用于检查其他线程是否被中断(如监控线程状态)
- 常用于循环中配合 `Thread.currentThread().isInterrupted()` 判断是否退出
- 示例:t.isInterrupted() 返回
true后,再次调用仍为true
interrupted():读+清,仅限当前线程
这是 `Thread` 类的静态方法,只能用于判断**当前正在执行的线程**是否被中断,并在返回结果的同时**将中断标志位设为 false**(即“消费”掉该中断信号)。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 第一次调用返回
true,第二次立即调用必返回false(除非中间又被 `interrupt()` 设置) - 典型用途:在可能响应中断的代码入口做一次“捕获并清除”,避免干扰后续逻辑
- 注意:它不接受参数,隐式作用于
Thread.currentThread()
中断标志位的真正清除时机
除了 `interrupted()`,还有两种常见方式会清除中断标志位:
-
抛出
InterruptedException:当线程在 `wait()`、`join()`、`sleep()` 等可中断阻塞方法中被中断时,JVM 会清除中断标志,并抛出异常(此时标志已为false) -
显式调用
interrupt():这其实是设置标志位为true,不是清除;但若线程已处于中断状态,重复调用无副作用
实用建议:如何安全判断和响应中断
推荐在业务循环中使用 Thread.currentThread().isInterrupted() 判断,避免因 `interrupted()` 的副作用导致漏判;只有在明确需要“一次性消费中断信号”的场景(如初始化阶段快速响应),才用 `interrupted()`。
- 不要依赖 `interrupted()` 连续判断——它是一次性的
- 捕获 `InterruptedException` 后,若不重新中断(`Thread.currentThread().interrupt()`),该中断信号就丢失了
- 自定义阻塞逻辑中,应定期检查 `isInterrupted()` 并主动退出,实现协作式中断
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










