如何停止一个线程

为什么不能用Thread.stop()方法停止线程?

Thread.stop()是不安全的,被stop的线程立即销毁,此线程访问的内存和文件没有进行保护处理,之后访问的线程会拿到错误的数据。

正确停止线程的方法

协作的任务执行模式

  • 通过目标线程自行结束,而不是强制停止
  • 目标线程应当具备处理中断的能力
  • 中断方式
    • Interrupt
    • volatile boolean 标志位

interrupted()与isInterrupted()区别

  • interrupted()是静态方法,获取当前线程的中断状态,并清空
    • 当前运行的线程
    • 中断状态调用后清空,重复调用后继续返回false
  • isInterrupted()是非静态方法,获取该线程的中断状态,不清空
    • 调用的线程对象对应的线程
    • 可以重复调用,中断清空前一直返回true

interrupt与boolean标志位对比

interrupt boolean标志位
对系统方法(sleep)有效
使用JNI
加锁
触发方式 抛异常 布尔值判断,也可抛异常
  • 需要支持系统方法(sleep)时用中断
  • 其他情况用boolean标志位(jni有性能开销,所以标志位性能更好)