Thread.interrupted() 、 Thread.currentThread().isInterrupted() 、Thread.interrupt() 区别
时间: 2025-07-29 10:19:28 浏览: 15
### Java 中 `Thread.interrupt()`、`Thread.currentThread().isInterrupted()` 和 `Thread.interrupted()` 的区别
#### 1. **`Thread.interrupt()`**
该方法用于向目标线程发送一个中断信号,即将线程的中断状态设置为 `true`。如果目标线程正处于阻塞状态(如 `sleep` 或 `wait`),则会抛出 `InterruptedException` 并清除中断状态;如果是非阻塞状态,则仅设置中断标志而不触发任何异常。
示例代码如下:
```java
public class InterruptExample {
public static void main(String[] args) throws InterruptedException {
Thread t = new Thread(() -> {
while (true) {
// 执行某些操作...
}
});
t.start();
Thread.sleep(1000);
t.interrupt(); // 向线程发送中断信号
}
}
```
此方法的核心作用在于通知线程应该停止其当前活动[^1]。
---
#### 2. **`Thread.currentThread().isInterrupted()`**
这是一个静态方法,返回当前线程的中断状态 (`true` 表示已中断),但不会改变中断状态。它适用于需要多次检查中断状态而不想重置中断标志的情况。
以下是使用场景的一个例子:
```java
public class IsInterruptedExample implements Runnable {
@Override
public void run() {
while (!Thread.currentThread().isInterrupted()) {
System.out.println("Running...");
try {
Thread.sleep(1000); // 模拟耗时任务
} catch (InterruptedException e) {
Thread.currentThread().interrupt(); // 恢复中断状态
}
}
System.out.println("Thread Stopped");
}
public static void main(String[] args) throws InterruptedException {
Thread t = new Thread(new IsInterruptedExample());
t.start();
Thread.sleep(3000);
t.interrupt(); // 发送中断信号
}
}
```
在此案例中,`isInterrupted()` 负责持续监控线程的状态变化,直到接收到中断请求为止[^2]。
---
#### 3. **`Thread.interrupted()`**
这是另一种获取线程中断状态的方式,但它不仅读取还清除了当前线程的中断标志位。因此,在连续调用之间需谨慎处理以免丢失重要信息。
下面展示了一个简单的应用情形:
```java
public class InterruptedExample {
public static void main(String[] args) throws InterruptedException {
Thread t = new Thread(() -> {
while (true) {
if (Thread.interrupted()) { // 检查并清除中断状态
System.out.println("Thread was interrupted, stopping.");
break;
}
System.out.println("Still running...");
}
});
t.start();
Thread.sleep(2000);
t.interrupt(); // 请求终止子线程
}
}
```
这里需要注意的是每次调用都会消耗掉一次中断事件记录[^3]。
---
### 总结对比表
| 特性/方法 | `Thread.interrupt()` | `Thread.currentThread().isInterrupted()` | `Thread.interrupted()` |
|-------------------|-----------------------------------------|---------------------------------------------|----------------------------------------|
| 功能 | 设置目标线程的中断状态 | 查询当前线程的中断状态 | 查询当前线程的中断状态并清除 |
| 是否修改状态 | 是 | 否 | 是 |
| 使用场合 | 唤醒阻塞线程或发出退出指令 | 需要反复判断是否被中断的情况下保持原样 | 只需一次性确认是否有过中断即可 |
以上即是对这三个函数特性的全面解析以及实际运用示范[^4][^5]。
阅读全文
相关推荐




















