116-采用优雅的方式结束线程生命周期

Graceful thread stop

  1. 使用开关变量控制是否启动

    private volatile boolean start = true;
    @Override
    public void run() {
        while (start) {
            // ...
        }
    }
    public void shutdown() {
        this.start = false;
    }
    worker.start();
    Thread.sleep(3_000);
    worker.shutdown();

    实用场景:当程序需要批量获取数据的时候,可以开辟多个线程执行任务,每个线程获取一部分数据,当程序执行完成后需要释放资源,即关闭线程。但是某些线程可能会出现问题导致无法正常关闭,此时需要使用开关变量来控制线程关闭。JVM中的线程主要是放在栈内存中,但是栈空间并不是很大,如果线程一直存在并越来越多可能出现栈内存溢出的情况。

  2. 通过打断的方式实现

    • 打断sleep()

      @Override
      public void run() {
          while (true) {
              // 1. sleep()
              try {
                  Thread.sleep(1);
              } catch (InterruptedException e) {
                  break;// return;
              }
          }
          // ... catch中使用break;可以在while()后执行其他操作
          System.out.println("break-opera after while");
      }
    • 打断if

      @Override
      public void run() {
          while (true) {
              // 2. if
              if (Thread.interrupted()) {
                  break;// return;
              }
          }
          // ... catch中使用break;可以在while()后执行其他操作
          System.out.println("break-opera after while");
      }
    worker.start();
    Thread.sleep(3_000);
    worker.interrupt();

思考:

在读操作的过程中线程被阻塞住blocked。此时没有机会打断或读flag,线程不能监听到打断操作。这种情况如何停止线程?暴力。

@Override
public void run() {
    // connection or read file
}

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 tuyrk@qq.com

文章标题:116-采用优雅的方式结束线程生命周期

文章字数:345

本文作者:神秘的小岛岛

发布时间:2019-11-23, 21:10:30

最后更新:2019-11-23, 21:58:13

原始链接:https://www.tuyrk.cn/wang-thread/116-graceful-stop-thread/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录
×

喜欢就点赞,疼爱就打赏