写点什么

并发编程系列:关于线程中断

发布于: 2021 年 02 月 10 日
并发编程系列:关于线程中断

系列:

并发编程系列:并发编程基础


什么是线程中断?

线程中断,通常是指运行中的线程被其他线程终端操作,而中断的方式,是通过执行中的线程与发出中断信号的线程之间通信得到的。在 Java 中,其他线程可以通过调用当前运行中线程的 interrupt()方法来对其执行中断操作。

当线程被中断时,会抛出 InterruptedException 异常。一个中断的示例代码如下:

public class ThreadInterruptedDemo {    public static void main(String[] args){        StopThread thread = new StopThread();        thread.start();
try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); }// thread.stop(); thread.interrupt(); while(thread.isAlive()){ } thread.print(); System.out.println("线程中断状态:+"+thread.isInterrupted()); }
static class StopThread extends Thread{ private int x = 0; private int y =0;
@Override public void run() { synchronized (this){ x++; try{ Thread.sleep(3000); }catch (InterruptedException e){ e.printStackTrace(); } y++; } }
void print(){ System.out.println("x="+x+",y="+y); } }}
复制代码

中断标记,可以理解为一个标识位,用来表示是否被其他线程进行了中断操作。线程通过检查自身是否发生中断来进行响应。这个判断,是使用 isInterrupted()方法,或静态方法 Thread.interrupted() (这个方法会对当前线程的中断标识位进行复位)。如果该线程已经处于终止状态,即使线程被中断过,在调用该线程对象的 isInterrupted()时,也会返回 false。

其他的线程中止/恢复方法

对线程来说,除了基础的 start()操作,还有暂停、恢复、停止。在 Java 的 Thread 中分别是 suspend()、resume()和 stop()。

但这些 API 已经被标记为废弃(Deprecated),已经不推荐使用。

@Deprecatedpublic final void suspend() {    checkAccess();    suspend0();}
复制代码

废弃原因:以 suspend()方法为例,在调用后,线程不会释放已经占有的资源(例如锁),而是占用着资源进入睡眠状态,这很容易引起死锁。同样,stop()在终结线程时也不能保证资源的正常释放,这可能会导致程序工作在不确定状态下。

作为替代方案,可以使用 interrupt()方法,或 volatile 变量作为标志位,来标记线程是否中断。这样虽然不一定能立即终止线程,但能够使线程在终止时有机会去清理资源,所以会更安全和优雅。

发布于: 2021 年 02 月 10 日阅读数: 20
用户头像

磨炼中成长,痛苦中前行 2017.10.22 加入

微信公众号【程序员架构进阶】。多年项目实践,架构设计经验。曲折中向前,分享经验和教训

评论

发布
暂无评论
并发编程系列:关于线程中断