java中判断线程是否被中断应读取中断标志位:thread.interrupted()检查并清除标志,适用于循环轮询;this.isinterrupted()只读不改,适合监控;阻塞中被中断会抛interruptedexception且清标志,需手动恢复;避免误用getstate、错调interrupted()或忽略异常。

Java 中判断当前线程是否被中断,关键不是看它“正在做什么”,而是读取它的中断标志位。这个标志由 interrupt() 方法设置,但不会自动停止线程,必须由线程自己检测并响应。
用 Thread.interrupted() 检查并清除状态
这是最常用的判断方式,适用于当前线程在循环中主动轮询的场景:
- 它是静态方法,只作用于当前正在执行的线程,和调用对象无关
- 返回
true表示中断标志为 true,同时会立即将标志重置为false - 适合写在 while 条件里,比如:
while (!Thread.interrupted()) { ... } - 注意:连续调用两次,第二次大概率返回
false(除非中间又被 interrupt)
用 this.isInterrupted() 检查但不改变状态
当你需要多次读取、或只是记录/监控中断状态时,用这个更安全:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 它是实例方法,可以对任意
Thread对象调用,比如worker.isInterrupted() - 只返回当前中断标志值,不会清空,后续调用结果不变
- 适合日志输出、状态上报等“只读”用途,避免误丢中断信号
阻塞中被中断要特别处理
如果线程正处在 sleep()、wait()、join() 或 BlockingQueue.take() 等可中断方法中,被 interrupt() 后会:
- 立即抛出
InterruptedException - JVM 自动把中断标志清为
false - 在
catch块里,若还想让上层继续感知中断,应手动恢复:Thread.currentThread().interrupt();
别踩这些坑
以下做法容易导致中断被忽略或逻辑错乱:
- 用
thread.getState() == WAITING判断是否中断 —— 状态和中断无关,RUNNABLE 的线程也可能已被中断 - 写成
someThread.interrupted()—— 编译通过,但实际检查的是当前线程,不是someThread - 捕获
InterruptedException后什么都不做 —— 中断信号丢失,线程可能永远无法退出 - 在计算密集型循环里完全不检查中断 —— 线程无法响应外部停止请求
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










