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();
}

中断

Java 线程中断机制详解_java线程中断-CSDN博客

中断流程确实可以概括为:

  1. A线程调用 B.interrupt()
  2. B线程的中断状态变为 true
  3. 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(); // 清除标志,假装没发生过
}
posted @ 2025-10-17 11:08  deyang  阅读(6)  评论(0)    收藏  举报