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