WMX · 随记
·Java· 3 分钟阅读

线程中断:取消是一份需要合作的约定

调用 interrupt 后,工作线程未必立刻退出。中断不是强制终止,而是让被调用方有机会检查或响应取消。

Java 系列概览:类型与值、状态与资源、边界验证
Java 系列概览:类型与值、状态与资源、边界验证 点击图片查看大图 ↗

问题从哪里出现

调用 interrupt 后,工作线程未必立刻退出。中断不是强制终止,而是让被调用方有机会检查或响应取消。

理解核心机制

阻塞操作可能抛 InterruptedException,异常会清除中断状态。当前层不能处理时,常见做法是恢复中断标记并结束当前操作,而不是吞掉异常继续工作。

动手做一个小实验

Java 17 或更新版本;将示例保存为 Demo.java,执行 javac Demo.java 后运行 java Demo。

Java14 行 · 可横向滚动
public class Demo {
    public static void main(String[] args) throws Exception {
        Thread worker = new Thread(() -> {
            try { Thread.sleep(10000); }
            catch (InterruptedException error) {
                Thread.currentThread().interrupt();
                System.out.println("cancelled");
            }
        });
        worker.start();
        worker.interrupt();
        worker.join();
    }
}

适用边界与常见误区

CPU 循环和第三方阻塞调用可能需要不同的取消设计。恢复标记之后继续无条件重试,也可能形成错误循环。

继续练习

为循环任务添加周期性中断检查,确认取消后资源在 finally 中释放,且不会悄悄启动下一次工作。

参考资料

阅读相关官方文档或原始资料 ↗

← 返回文章归档