什么是中断?

在 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等)中的应用场景,我可以继续补充。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值