java 结束线程

作者: chenxuxu | 来源:发表于2018-07-22 20:32 被阅读13次

    前言

    一般线程执行完 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;
                    }
                }
            }
        }
    

    相关文章

      网友评论

        本文标题:java 结束线程

        本文链接:https://www.haomeiwen.com/subject/vdxbuftx.html