在 java 线程创建与运行中,interrupted() 方法用于检测当前线程是否被中断,并清除中断状态。它通常在线程内部循环或阻塞操作前调用,以便及时响应外部中断请求。

如何在线程任务中检查中断状态
通过调用 Thread.interrupted() 可以获取当前线程的中断标志位,并在返回后将其重置为 false。这适用于需要频繁检查中断状态的场景,例如在长耗时任务中定期退出。

public class InterruptCheckTask implements Runnable {
@Override
public void run() {
while (!Thread.interrupted()) {
System.out.println("Working...");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
Thread.currentThread().interrupt(); // 恢复中断状态
break;
}
}
System.out.println("Task terminated due to interrupt.");
}
}
上述代码展示了如何在 run 方法中使用 Thread.interrupted() 进行轮询检查。当外部调用 thread.interrupt() 时,sleep 会抛出异常,此时需手动恢复中断状态,确保上层逻辑能感知到中断信号。
中断状态对阻塞操作的影响
当线程处于阻塞状态(如 sleep、wait)时,若被中断,将抛出 InterruptedException 并清除中断标志。开发者需在捕获异常后决定是继续执行还是重新设置中断状态。

public class BlockingInterruptExample {
public static void main(String[] args) throws InterruptedException {
Thread worker = new Thread(() -> {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
System.out.println("Interrupted during sleep.");
// 不恢复中断状态,直接退出
}
});
worker.start();
Thread.sleep(1000);
worker.interrupt();
worker.join();
}
}
该示例演示了阻塞操作中处理中断的标准流程:捕获异常后打印日志并退出循环。由于未调用 Thread.currentThread().interrupt(),中断状态未被保留,适合不需要向上传播中断信号的简单任务。
中断状态清除后的行为验证
在 BlockingInterruptExample 中,sleep 抛出异常后中断标志被 JVM 自动清除。若后续代码再次调用 Thread.interrupted(),将返回 false,表明中断状态已失效。这种设计防止了中断信号的重复消费,但也要求开发者显式恢复状态以支持链式中断处理。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











