线程中断的注意事项

2020-02-26  本文已影响0人  WaterYuan
0x01、线程有着明确的6个状态(java.lang.Thread.State):

NEW,
RUNNABLE ,
BLOCKED,
WAITING ,
TIMED_WAITING ,
TERMINATED 。

0x02、谁受中断标志的影响?

BLOCKED状态一般是因为synchronized等无法获取锁导致线程被阻塞,
当线程处于BLOCKED状态时,执行其interrupt方法不会抛异常,只会设置其中断标志位为true,线程仍会继续运行

当线程处于 WAITING 和 TIMED_WAITING 时,线程才会自动检测中断标志位,当中断标记为true产生InterruptedException。
线程的WAITING 和 TIMED_WAITING状态一般是由 wait, sleep, join 这3个方法引起的。

0x03、谁会检测中断标志位?
  • 一个是用户自己通过isInterrupt()去检测
  • 一个是WAITING 和 TIMED_WAITING 里线程自动检测
  • 阻塞状态,线程是不会自动检测中断标志位的
0x04、线程的interrupt()方法先被调用,后进入等待状态,还会抛出InterruptedException异常吗?

会,因为等待状态会自动检测中断标志位

0x05、线程捕获InterruptedException异常后,再进入等待状态,还会再次抛出InterruptedException异常吗?

不会,因为InterruptedException已清空中断标志位


一文搞懂 Java 线程中断
Java 线程中断机制整理
如何"优雅"地终止一个线程?
如何优雅的关闭Java线程池

上一篇 下一篇

猜你喜欢

热点阅读