并发编程系列:关于线程中断
系列:
什么是线程中断?
线程中断,通常是指运行中的线程被其他线程终端操作,而中断的方式,是通过执行中的线程与发出中断信号的线程之间通信得到的。在 Java 中,其他线程可以通过调用当前运行中线程的 interrupt()方法来对其执行中断操作。
当线程被中断时,会抛出 InterruptedException 异常。一个中断的示例代码如下:
中断标记,可以理解为一个标识位,用来表示是否被其他线程进行了中断操作。线程通过检查自身是否发生中断来进行响应。这个判断,是使用 isInterrupted()方法,或静态方法 Thread.interrupted() (这个方法会对当前线程的中断标识位进行复位)。如果该线程已经处于终止状态,即使线程被中断过,在调用该线程对象的 isInterrupted()时,也会返回 false。
其他的线程中止/恢复方法
对线程来说,除了基础的 start()操作,还有暂停、恢复、停止。在 Java 的 Thread 中分别是 suspend()、resume()和 stop()。
但这些 API 已经被标记为废弃(Deprecated),已经不推荐使用。
废弃原因:以 suspend()方法为例,在调用后,线程不会释放已经占有的资源(例如锁),而是占用着资源进入睡眠状态,这很容易引起死锁。同样,stop()在终结线程时也不能保证资源的正常释放,这可能会导致程序工作在不确定状态下。
作为替代方案,可以使用 interrupt()方法,或 volatile 变量作为标志位,来标记线程是否中断。这样虽然不一定能立即终止线程,但能够使线程在终止时有机会去清理资源,所以会更安全和优雅。
版权声明: 本文为 InfoQ 作者【程序员架构进阶】的原创文章。
原文链接:【http://xie.infoq.cn/article/1f6be67aa3e94299adbf6eb03】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论