在 Java 中,“中断(Interrupt)” 是一种协作式的线程停止机制,它允许一个线程通过中断信号来请求另一个线程“尽快停止当前操作”,但不是强制终止线程。
✅ 一、什么是中断?
中断是指:一个线程向另一个线程发送中断信号,提示它“可以停止当前任务”,被中断的线程可以根据自身逻辑判断是否真正停止。
Java 提供的中断机制是非强制性的、协作式的,即:
-
中断并不会直接终止线程。
-
被中断的线程需要自己响应中断并采取行动(例如退出循环、抛异常、关闭资源等)。
✅ 二、如何中断线程?
Java 提供了如下 API 来进行线程中断:
1. Thread.interrupt()
向目标线程发送中断信号。
Thread t = new Thread(() -> {
while (!Thread.currentThread().isInterrupted()) {
// 执行任务
}
});
t.start();
// 中断线程
t.interrupt();
2. Thread.isInterrupted()
判断线程是否被中断(不会清除中断标志位)。
3. Thread.interrupted()
判断线程是否被中断,并清除中断标志位(静态方法,只作用于当前线程)。
✅ 三、哪些方法会响应中断?
某些阻塞方法在被中断时会抛出 InterruptedException
,例如:
-
Thread.sleep()
-
Object.wait()
-
BlockingQueue.take()
-
CountDownLatch.await()
-
Future.get()
-
Thread.join()
当这些方法抛出中断异常时,中断标志位会被清除,因此需要开发者手动重新设置中断标志:
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
Thread.currentThread().interrupt(); // 恢复中断状态
// 执行中断处理逻辑
}
✅ 四、线程如何响应中断?
一般有三种响应方式:
1. 检查 isInterrupted()
状态退出循环
while (!Thread.currentThread().isInterrupted()) {
// 执行任务
}
2. 处理中断异常 InterruptedException
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
Thread.currentThread().interrupt(); // 恢复中断标志
return; // 退出线程
}
3. 配合中断标志 + 资源释放
try {
while (!Thread.currentThread().isInterrupted()) {
// 任务处理
}
} finally {
// 清理资源
}
✅ 五、线程池中的中断行为?
使用线程池时,通过 shutdownNow()
会向所有正在执行的线程发送中断请求:
ExecutorService executor = Executors.newFixedThreadPool(2);
executor.submit(() -> {
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
System.out.println("线程被中断");
}
});
executor.shutdownNow(); // 会调用线程的 interrupt()
✅ 六、中断与停止线程的区别?
方式 | 是否强制 | 是否安全 | 是否推荐 |
---|---|---|---|
Thread.stop() | 是 | 否(有风险) | ❌ 已弃用 |
Thread.interrupt() | 否(协作式) | 是 | ✅ 推荐 |
✅ 七、总结
-
中断是 Java 提供的一种线程协作机制,表示一个线程希望另一个线程停止运行。
-
中断不会强制停止线程,被中断线程需要主动检查并响应。
-
通过
isInterrupted()
和InterruptedException
来控制逻辑退出。 -
中断是一种“温和的停止方式”,推荐使用它来控制线程生命周期。
如你希望深入了解线程中断在实际业务(如定时任务、线程池、Netty等)中的应用场景,我可以继续补充。