线程中断:取消是一份需要合作的约定
调用 interrupt 后,工作线程未必立刻退出。中断不是强制终止,而是让被调用方有机会检查或响应取消。
问题从哪里出现
调用 interrupt 后,工作线程未必立刻退出。中断不是强制终止,而是让被调用方有机会检查或响应取消。
理解核心机制
阻塞操作可能抛 InterruptedException,异常会清除中断状态。当前层不能处理时,常见做法是恢复中断标记并结束当前操作,而不是吞掉异常继续工作。
动手做一个小实验
Java 17 或更新版本;将示例保存为 Demo.java,执行 javac Demo.java 后运行 java Demo。
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 中释放,且不会悄悄启动下一次工作。