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已清空中断标志位