死锁的避免
- 持有并等待。尝试获取锁,超时则释放已有锁并重试。
- 保证所有线程获取锁的顺序完全一致
shutdown()和shutdownNow()
调用线程池的shutdown()或shutdownNow()方法,线程当前状态如何处理
| 线程当前状态 | shutdown() | shutdownNow() |
|---|---|---|
| 正在执行任务 | 继续执行,完成后退出 | 中断线程,但任务可能继续执行,取决于是否响应中断,不是"完成后退出",而是任务执行完后检测到 STOP 状态退出,如果任务不响应中断,会一直执行到完成(可能无限循环) |
| 等待获取任务 | 中断空闲线程, 线程在 workQueue.take() 处被中断,抛出InterruptedException异常,线程池自己捕捉到这个异常,继续自旋判断如果队列为空,rerurn null后,线程自然结束。 | 中断所有线程, 线程在 workQueue.take() 处被中断,抛出InterruptedException异常,线程池自己捕捉到这个异常,继续自旋判断发现是STOP,不管任务队列是否为空直接rerurn null后,线程自然结束。 |
| 刚获取任务 | 正常执行该任务 | 中断线程,任务可能执行也可能不执行,任务可能继续执行,取决于是否响应中断,不是"完成后退出",而是任务执行完后检测到 STOP 状态退出,如果任务不响应中断,会一直执行到完成(可能无限循环) |
| 新提交任务 | 拒绝(抛出异常) | 拒绝(抛出异常) |
| 线程池状态 | SHUTDOWN | STOP |