线程中断
1、前置知识
- 对于调用 wait() , join() ,sleep() 方法的线程会进入 WAITTING,TIME_WAITING状态,让出CPU执行权,此时如果该线程的interrupt()方法被调用,就会抛出中断异常InterruptedException。可以在catch块中感知。
- 对于正在运行的线程如果被调用interrupt()方法,则该线程会被打上一个标记,在线程内部可以通过调用isInterupted() 感知。
- 处于BLOCKED状态的线程无法响应中断。
2、自己的理解
问1:为什么会有中断这个机制呢?
中断的意义是为了优雅的停止某个线程,让线程自己感知他被中断了,然后进行一些必要逻辑的处理。如果没有中断,不如调用 Thread.stop() 方法,线程会被无条件结束。很可能导致一些错误。
问2:为什么wait() , join() ,sleep() 已经让出了CPU时间片,还可以感知中断异常呢?
当阻塞的线程的interrupt()方法被调用后,JVM会将该线程的状态转变为可运行状态,然后抛出中断异常。
问3:我们该捕获中断异常还是抛出?
和对待其他异常的原则一样,当我们知道如何处理这个异常的时候就可以捕获,如果当前处理不了就抛出。
问4:竞争不到锁而处于BLOCKED状态的线程能否响应中断?
其一:由于处于BLOCKED状态只能通过异常机制来响应中断,能使线程进入BLOCKED状态的只有synchronized关键字。但是关键字是无法抛出异常的,方法才能抛出异常。
其二:一个线程不可能一直处于BLOCKED状态,不然就是线程饥饿或者线程死锁了,虽然BLOCKED无法响应中断,但是进入运行状态就可以感知到了,所以是没问题的。