介绍
使用介绍:使用interrupt来通知,而不是强制:是用一个线程来通知另外一个线程停止,“通知”可以理解为,发出通知的线程可能“不了解”被通知线程业务,所以被通知线程会根据自身业务情况来判断是否停止。
最佳实践
1、如何正确停止线程
通常停止情况(无外界干涉的情况下)
a. run方法正常结束,会停止
b. 异常出现,方法中没有捕获也会停止
正确方法:用interrupt来请求停止线程
1、普通情况,线程中断(run方法内没有sleep或wait方法时的标准写法)
备注:1和2同时出现,线程才会停止,只出现1,线程默认不会停止。
2、线程可能被堵塞
3、如果线程在每次工作迭代(循环)之后都堵塞(调用sleep方法等)
4、如果不这样写,会遇到的问题:线程无法停止
5、实际生产开发时要注意的编码习惯:
两种最佳处理方式
以上这两种情况,分别代码演示,解释优点
6、可以为了响应中断而抛出InterruptedException的常见方法列表总结
好处
2、错误停止的方法
被弃用的stop、suspend和resume方法
使用stop的后果
关于stop的一种错误理论
suspend的问题
用volatile设置boolean标记位
3、停止线程相关的重要函数解析
中断线程
interrupt方法原理
判断是否已中断
static boolean interrupted()
boolean isInterrupted()
举例说明,注意Thread.interrupted()的目的对象是”当前线程“,而不管本方法
常见问题
如何停止线程
如果处理不可中断的阻塞(例如抢锁时ReentrantLock.lock()或者Socket I/O