Android开发经验谈Android技术知识Android开发

java 结束线程

2018-07-22  本文已影响13人  chenxuxu

前言

一般线程执行完 run 方法后,线程就正常结束了。但有时候 run 方法永远不会结束。因此,此时需要特殊处理,结束线程。

第一种方法

添加标志位

  public class MyThread extends Thread {
      public volatile boolea exit = false;

      public void run() {
          while (!exit) {
              // do something
          }
      }
  }

第二种方法

使用 stop 方法终止。不推荐使用,原因有三个:

  1. stop 方法已经被标识为过时方法;
  2. stop 方法终止,会发生不可预料的结果。比如运行一半,突然终止。会导致代码逻辑不完整,对结果不可预测;
  3. 会破坏锁的原子操作。假设线程中有锁,调用 stop 后,会将内部的所有锁释放,其他获取的原子操作数据,可能就是不准确的。

第三种方法

使用 interrupt 方法。interrupt 跟标志位方法很像,但是在阻塞状态也能退出来。

分两种情况,
第一种是线程未进入阻塞状态,调用 interrupt 后,中断标识为变成 true。中断标识为 while (!isInterrupted());

第二种就是阻塞状态调用 interrupt 后,线程中会抛出一个异常,捕获异常并跳出循环即可。

两者结合后,代码如下:

    public class MyThread extends Thread {

        @Override
        public void run() {
            super.run();
            while (!isInterrupted()) {
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                    break;
                }
            }
        }
    }
上一篇下一篇

猜你喜欢

热点阅读