Java线程中断标志是协作式通知信号而非强制终止开关,调用interrupt()仅设标志为true,响应方式由线程自身决定;isInterrupted()读取不重置,interrupted()读取后重置,阻塞中抛出InterruptedException并自动清标,非阻塞需轮询检测并手动处理。
Java线程中断标志是一个布尔类型的内部状态位,每个Thread对象都维护一个独立的interrupted标志(初始为false)。它不是用来强制终止线程的开关,而是一种轻量级、协作式的“通知信号”——调用thread.interrupt()只是把该标志设为true,后续是否响应、何时响应、如何收尾,完全由线程自身逻辑决定。
中断标志的读写有明确语义区分:
thread.isInterrupted():实例方法,返回目标线程当前的中断标志值,不改变该标志Thread.interrupted():静态方法,返回当前线程的中断标志值,并立即将其重置为false
thread.interrupt():向目标线程发送中断请求,仅设置标志为true(若线程正阻塞在可中断方法中,则触发异常并清空标志)当线程调用sleep()、wait()、join()或可中断I/O等方法时,若此时中断标志为true,这些方法会立即抛出InterruptedException,并在抛出前把中断标志重置为false。这意味着:
catch块后,Thread.interrupted()或isInterrupted()都会返回false
Thread.currentThread().interrupt()),上层调用者将无法感知本次中断,容易造成“中断丢失”对于长时间运行的计算型任务(无阻塞调用),线程需在循环中定期检查中断状态,否则永远不会响应中断:
while (!Thread.currentThread().isInterrupted()) { /* 执行任务 */ }
Thread.interrupted()做循环条件,因为它每次调用都清空标志,可能导致漏判中断机制的设计哲学是“通知而非命令”。它与已废弃的stop()、suspend()有本质区别:
stop()会强行终止线程,可能破坏数据一致性、导致资源泄漏