当前位置: 首页 > article >正文

第三百一十九节 Java线程教程 - Java线程中断

Java线程教程 - Java线程中断

我们可以通过使用interrupt()方法中断一个活动的线程。

这个方法调用在线程只是一个指示。它是由线程如何响应中断。

例子

下面的代码显示了中断主线程并打印线程中断状态的代码。

public class Main {
  public static void main(String[] args) {
    System.out.println("#1:" + Thread.interrupted());

    // Now interrupt the main thread
    Thread.currentThread().interrupt();

    // Check if it has been interrupted
    System.out.println("#2:" + Thread.interrupted());

    // Check again if it has been interrupted
    System.out.println("#3:" + Thread.interrupted());
  }
}

上面的代码生成以下结果。

例2

下面的代码如何一个线程将中断另一个线程。

public class Main {
  public static void main(String[] args) {
    Thread t = new Thread(Main::run);
    t.start();
    try {
      Thread.currentThread().sleep(1000);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
    t.interrupt();
  }

  public static void run() {
    int counter = 0;
    while (!Thread.interrupted()) {
      counter++;
    }
    System.out.println("Counter:" + counter);
  }
}

上面的代码生成以下结果。

例3

Thread类有一个非静态的isInterrupted()方法,可以用来测试一个线程是否被中断。

public class Main {
  public static void main(String[] args) {
    System.out.println("#1:" + Thread.interrupted());

    Thread mainThread = Thread.currentThread();
    mainThread.interrupt();

    System.out.println("#2:" + mainThread.isInterrupted());

    System.out.println("#3:" + mainThread.isInterrupted());

    System.out.println("#4:" + Thread.interrupted());

    System.out.println("#5:" + mainThread.isInterrupted());
  }
}

上面的代码生成以下结果。

例4

你可以中断一个被阻塞的线程。

如果在这三种方法上阻塞的线程被中断,则抛出一个InterruptedException,并清除线程的中断状态。

以下代码启动一个休眠一秒的线程,并打印一条消息,直到它被中断。

public class Main {
  public static void main(String[] args) throws InterruptedException{
    Thread t = new Thread(Main::run);
    t.start();
    Thread.sleep(5000);
    t.interrupt();
  }

  public static void run() {
    int counter = 1;
    while (true) {
      try {
        Thread.sleep(1000);
        System.out.println("Counter:" + counter++);
      } catch (InterruptedException e) {
        System.out.println("I got  interrupted!");
      }
    }
  }
}

尝试一下

上面的代码生成以下结果。


http://www.kler.cn/a/388752.html

相关文章:

  • LabVIEW开发相机与显微镜自动对焦功能
  • CentOS 服务
  • WPF学习之路,控件的只读、是否可以、是否可见属性控制
  • ML 系列: 第 23 节 — 离散概率分布 (多项式分布)
  • DOM 规范 — MutationObserver 接口
  • 如何在Puppeteer中实现表单自动填写与提交:问卷调查
  • element-ui-plus给头像avatar增加头像框
  • 红黑树的平衡之舞:数据结构中的优雅艺术
  • Linux进程信号(信号的产生)
  • 你对安装在自己网站上的wordpress插件了解吗?
  • 【C语言】浮点型数据存储 和 整型数据存储的区别
  • 基于深度学习的路面裂缝检测算法matlab仿真
  • C#-运算符重载
  • Redis运行时的10大重要指标
  • 1688拿货经验分享:亚马逊中小卖家如何选合作厂家
  • JS面试题之---解释一下什么是闭包?
  • 【日常经验】RPC 调用的分类及示例
  • 非关系型数据库NoSQL的类型与优缺点对比
  • API接口精准获取商品详情信息案例
  • 【前端】Svelte:响应性声明
  • 动态规划(二)——路径问题
  • Android13 系统/用户证书安装相关分析总结(三) 增加安装系统证书的接口遇到的问题和坑
  • VScode配置C、C++环境,编译并运行并调试
  • Java之List常见用法
  • VUE3实现好看的通用网站源码模板
  • 深度学习经典模型之VGGNet