Java中断
Java中断
引言:为什么需要线程中断?
在并发编程中,我们经常需要协调不同线程的执行。
有时,一个线程需要通知另一个线程停止其当前正在执行的任务。
你可能会想到一些看似直接的方法,比如调用 Thread.stop() 或 Thread.suspend()。然而,这些方法已被明确废弃 (Deprecated),因为它们存在严重的缺陷:
- Thread.stop(): 强制终止线程,不给线程任何清理资源(如释放锁、关闭文件、网络连接等)的机会。这可能导致对象状态不一致,引发难以预料的错误。想象一下,一个线程正在修改共享数据,只修改了一半就被 stop() 了,这会留下一个“残缺”的数据结构,其他线程使用时就会出错。
- Thread.suspend() 和 Thread.resume(): 容易导致死锁。如果一个线程在持有锁的情况下被 suspend(),它将永远不会释放该锁,其他需要该锁的线程将无限期等待。
为了解决这些问题,Java 引入了线程中断 (Thread Interruption) 机制。线程中断并非强制终止线程,而是一种协作式的通信机制。它允许一个线程向另一个线程发送一个“请求停止”的信号,而被请求的线程可以自行决定如何以及何时响应这个信号,从而有机会进行必要的清理工作,实现“优雅地”停止。
个人总结:java中断的作用就是去通知一个线程停止,这个线程可以收到停止通知后(抛InterruptedException异常),进行一些代码处理(捕获InterruptedException异常),这比直接停止线程(Thread.stop() )或 Thread.suspend()好。
// 这种模式让"停止"变得可控,给了线程一个执行清理工作的机会。
try {
// 主要工作
doRealWork();
} catch (InterruptedException e) {
// 停止时的清理工作
doCleanup();
}
中断
中断流程确实可以概括为:
- A线程调用
B.interrupt() - B线程的中断状态变为
true - B线程检测到中断状态后做出相应处理
简单总结来说就是A线程让另一个B线程中断,B变成中断状态,然后B线程中断状态下做处理,中断就是为了让B线程去做这个处理。
// A线程
B.interrupt(); // 做两件事:
// 1. 设置B的中断标志为true
// 2. 如果B在sleep/wait/join中,会抛出InterruptedException
中断是一种协作机制:线程A通过设置标志和唤醒的方式通知线程B"有事需要关注",线程B检测到后根据自己的业务逻辑决定如何响应这个通知。
中断 = 设置标志 + 唤醒阻塞 + 让目标线程自行决定如何响应
// 发起方A:发送通知
threadB.interrupt(); // "B,有事找你!"
// 接收方B:自行决定如何响应
public void run() {
// 方式1:终止
if (Thread.currentThread().isInterrupted()) {
cleanup();
return;
}
// 方式2:处理事件后继续
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
handleEvent(); // 处理事件
// 继续运行
}
// 方式3:忽略(不推荐)
// Thread.interrupted(); // 清除标志,假装没发生过
}
浙公网安备 33010602011771号