知识卡片

中断只是设置一个标志

普通读书笔记卡 · 1507

内容

interrupt() 不是强制终止线程(那是已废弃的 stop() 的做法,可能让持锁或操作数据库的线程被强行打断),而是设置中断标志。对阻塞中(wait/join/sleep)的线程,会让它立即退出阻塞并抛 InterruptedException;对运行中的线程,只是把标志位设为 true,需要自己调用 isInterrupted() 检查并决定是否退出。

参考来源

- 位置:《Java高并发核心编程.卷2,多线程、锁、JMM、JUC、高并发设计模式》第1章《多线程原理与实战》1.5.3节《线程的interrupt操作》(源文件:_epub-src/OEBPS/Text/chapter26.xhtml) - 结论依据:原文明确"此方法本质不是用来中断一个线程,而是将线程设置为中断状态",并分两种情况说明:阻塞状态的线程会抛出InterruptedException提早终结阻塞;运行中的线程"不受任何影响,继续运行,仅仅是线程的中断标记被设置为true",需要程序自己检查isInterrupted(),因此推出本卡结论。 - 原始内容:Thread的interrupt()方法……此方法本质不是用来中断一个线程,而是将线程设置为中断状态……如果此线程正处于运行之中,线程就不受任何影响,继续运行,仅仅是线程的中断标记被设置为true……Thread.interrupt()方法只是改变中断状态,不会中断一个正在运行的线程,线程是否停止执行,需要用户程序去监视线程的isInterrupted()状态,并进行相应的处理。