文章目录
如何停止线程
- 如何停止线程
- 如何处理不可中断的阻塞
-
原理 用interrupt 来处理的好处 可以保证数据安全, 可以把主动权交给被中断的线程.
-
想要停止线程, 需要请求方, 被停止方, 子方法被调用方相互配合 请求方, 调用interrupt()方法, 发出中断的信号 . 被停止方, 在每次的循环或者适当的时候, 去检查中断的信号, 判断该线程是否被中断了. 并且在可能抛出
InterruptedException
异常的时候, 去处理中断信号. 每一个被中断的线程, 都应该去做这样的操作, 以便于可以被安全的停止. 子方法的最佳实践: 1 优先在方法层抛出异常, 以便于其他人去做相应的处理. 2 或者在收到中断信号后, 在catch语句中, 再次设为中断的状态. -
错误的方法 stop/suspend已经被废弃. volatile的boolean方法无法处理长时间阻塞的情况. 这种阻塞的状态, 在生产环境很有可能发生.
在io操作, 或者ReentrantLock的时候, 可能会发生不可中断的阻塞 .
暂时没有通用的解决方案, 要针对不同的锁和不同的io操作,给出特定的解决方案.
例如ReentrantLock
这个锁提供了public void lockInterruptibly() throws InterruptedException
这个方法 , 专门的用于响应中断信号.