为什么不能用Thread.stop()
方法停止线程?
Thread.stop()
是不安全的,被stop的线程立即销毁,此线程访问的内存和文件没有进行保护处理,之后访问的线程会拿到错误的数据。
正确停止线程的方法
协作的任务执行模式
- 通过目标线程自行结束,而不是强制停止
- 目标线程应当具备处理中断的能力
- 中断方式
- Interrupt
- volatile boolean 标志位
interrupted()与isInterrupted()区别
- interrupted()是静态方法,获取当前线程的中断状态,并清空
- 当前运行的线程
- 中断状态调用后清空,重复调用后继续返回false
- isInterrupted()是非静态方法,获取该线程的中断状态,不清空
- 调用的线程对象对应的线程
- 可以重复调用,中断清空前一直返回true
interrupt与boolean标志位对比
interrupt | boolean标志位 | |
---|---|---|
对系统方法(sleep)有效 | 是 | 否 |
使用JNI | 是 | 否 |
加锁 | 是 | 否 |
触发方式 | 抛异常 | 布尔值判断,也可抛异常 |
- 需要支持系统方法(sleep)时用中断
- 其他情况用boolean标志位(jni有性能开销,所以标志位性能更好)