阻塞方法
- 一个方法会被打断,那么一定是阻塞方法
- 阻塞方法不仅受限于CPU、内存,还受限于其他操作系统事件:时间片过期、I/O阻塞、其他线程的操作(锁释放、临界资源-标识位的改变、工作队列上新增的任务等)
- 阻塞性方法可能会死循环,所以一般的操作都是可打断的,也就意味着不是原子的
线程中断
- 线程有一个boolean字段,表示interrupted状态
- 如果线程在执行低优先级的阻塞方法(Thread.sleep(),Thread.join(),Object.wait()),那么会接触阻塞状态并且抛异常InterruptedException。
- 否则仅仅只是设置interrupt flag,这样可以让我们的代码自己去判断被中断应该怎么处理
- 好处是更加安全地构建可取消的事件,但是代码会更复杂。数据结构、标示位、锁的中间态如果没有清楚,这些处于未知中间态的多线程临界资源将会使代码非常不稳定。