JAVA-基础语法-多线程基础-中断线程

举报
Photon2 发表于 2020/12/15 12:41:36 2020/12/15
【摘要】 JAVA-基础语法-多线程基础-中断线程

中断线程

方法一

注意:此处的 Thread.sleep 对应的是主线程,而不是在执行的线程

public class InterruptThread {
   public static void main(String[] args) throws InterruptedException {
       Thread t = new MyThread();
       t.start();
       Thread.sleep(1); // 主线程暂停1毫秒
       t.interrupt(); // 中断t线程
       t.join(); // 等待t线程结束
       System.out.println("end");
  }
}

class MyThread extends Thread {
   public void run() {
       int n = 0;
       while (! isInterrupted()) {
           n ++;
           System.out.println(n + " hello!");
      }
  }
}

方法二

如果线程处于等待中,发起interrupt请求会如何?

public class Main {
   public static void main(String[] args) throws InterruptedException {
       Thread t = new MyThread();
       t.start();
       Thread.sleep(1000);
       t.interrupt(); // 中断t线程
       t.join(); // 等待t线程结束
       System.out.println("end");
  }
}

class MyThread extends Thread {
   public void run() {
       Thread hello = new HelloThread();
       hello.start(); // 启动hello线程
       try {
           hello.join(); // 等待hello线程结束
      } catch (InterruptedException e) {
           System.out.println("interrupted!");
      }
       hello.interrupt();
  }
}

class HelloThread extends Thread {
   public void run() {
       int n = 0;
       while (!isInterrupted()) {
           n++;
           System.out.println(n + " hello!");
           try {
               Thread.sleep(100);
          } catch (InterruptedException e) {
               break;
          }
      }
  }
}

main线程通过调用t.interrupt()从而通知t线程中断,而此时t线程正位于hello.join()的等待中,此方法会立刻结束等待并抛出InterruptedException。由于我们在t线程中捕获了InterruptedException,因此,就可以准备结束该线程。在t线程结束前,对hello线程也进行了interrupt()调用通知其中断。如果去掉这一行代码,可以发现hello线程仍然会继续运行,且JVM不会退出。

方法三

设置标志位

public class Main {
   public static void main(String[] args)  throws InterruptedException {
       HelloThread t = new HelloThread();
       t.start();
       Thread.sleep(1);
       t.running = false; // 标志位置为false
  }
}

class HelloThread extends Thread {
   public volatile boolean running = true;
   public void run() {
       int n = 0;
       while (running) {
           n ++;
           System.out.println(n + " hello!");
      }
       System.out.println("end!");
  }
}

注意到HelloThread的标志位boolean running是一个线程间共享的变量。线程间共享变量需要使用volatile关键字标记,确保每个线程都能读取到更新后的变量值。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。