java 中断线程的几种方式 interrupt()详解

Java 中断线程的几种方式 interrupt()详解

在 Java 中,一条线程可以通过另一条线程中断,可以说是线程通信的一种方式。本文将会详细的讲解 Java 中线程中断的几种方式以及如何检测线程是否被中断。

interrupt() 方法

Java 提供了 interrupt() 方法作为一种中断线程的方式,在线程启动后,可以使用该方法将线程设置为中断状态。此时线程就可以根据自己的需要作出相应的处理。

比如,假设我们有一条线程在等待某个输入,但是在等待的过程中,我们希望用户可以终止该线程并结束整个程序,那么就可以在我们需要中断线程的时候,使用 interrupt() 方法将其设置为中断状态。

这里需要注意的是,通过 interrupt() 方法设置线程为中断状态并不意味着它会立即停止工作,它仅仅是告诉该线程,可以作出相应的响应了。如果线程的 code 中没有对中断做响应,则什么也不会发生。下面我们来看几个中断线程的方式:

中断处于阻塞状态的线程

处于阻塞状态的线程可以通过 interrupt() 方法跳出阻塞状态。例如,如果一个线程正在等待 I/O 操作完成或等待获取一个锁,此时我们中断该线程,则它将抛出一个 InterruptException 异常来允许该线程退出阻塞状态。

示例代码:

public class TestInterrupt {
    public static void main(String[] args) throws InterruptedException {
        Thread myThread = new Thread(() -> {
            try {
                // 等待获取锁
                synchronized(TestInterrupt.class) {
                    TestInterrupt.class.wait();
                }
            } catch (InterruptedException e) {
                System.out.println(Thread.currentThread().getName() + " 被中断了!");
            }
        });

        myThread.start();
        Thread.sleep(2000L);

        // 中断 myThread 线程
        myThread.interrupt();
    }
}

运行该代码,我们可以看到输出的信息:Thread-0 被中断了!,表示该线程已被成功中断。

检测线程是否被中断

在本示例中,我们使用了 isInterrupted() 方法来查看线程是否被中断。如果该方法返回 true,则表示线程已经被中断了。

示例代码:

public class TestInterrupt {
    public static void main(String[] args) {
        Thread myThread = new Thread(() -> {
            while (!Thread.currentThread().isInterrupted()) {
                System.out.println("线程正在运行...");
            }
            System.out.println("线程被中断了!");
        });
        myThread.start();

        // 中断线程
        myThread.interrupt();
    }
}

输出的结果应该如下:

线程正在运行...
线程正在运行...
线程正在运行...
线程被中断了!

在上面的代码中,我们首先启动一个线程,然后在该线程中使用了一个 while 循环,不断检查该线程是否被中断。当线程被中断时,跳出循环并打印日志。

sleep() 和 join() 方法的中断

在使用 sleep() 和 join() 方法使线程处于阻塞状态时,如果线程在等待过程中被中断,则它会立即抛出 InterruptedException 异常,以唤醒线程并退出阻塞状态。

这种情况也需要使用 try-catch 语句来捕获异常,以确保线程可以进行正常的工作。

示例代码:

public class TestInterrupt {
    public static void main(String[] args) throws InterruptedException {
        Thread myThread = new Thread(() -> {
            try {
                // 线程休眠5秒
                Thread.sleep(5000L);
            } catch (InterruptedException e) {
                System.out.println(Thread.currentThread().getName() + " 被中断!");
            }
        });

        myThread.start();
        Thread.sleep(2000L);

        // 中断线程
        myThread.interrupt();
    }
}

注意,在上面的代码中,线程休眠的时间为 5 秒钟。我们需要等待一段时间以确保线程已经处于休眠状态。如果我们不加等待直接执行 myThread.interrupt(),则线程可能还没有进入睡眠状态,从而没有被中断。

结论

通过本文,我们了解了 Java 中通过 interrupt() 方法中断线程的几种方式:中断处于阻塞状态的线程、检测线程是否被中断,sleep() 方法和 join() 方法的中断。

在实际应用中,我们可以根据我们的需求使用适当的方式来中断线程,以确保线程可以正常的停止、释放资源,并且确保我们设计的算法是正确的。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java 中断线程的几种方式 interrupt()详解 - Python技术站

(0)
上一篇 2023年5月18日
下一篇 2023年5月18日

相关文章

  • Java中List集合的深入介绍(超级推荐!)

    Java中List集合的深入介绍 1. List集合简介 List是Java集合框架中最基本,且使用频率最高的一种集合。List是有序的集合,元素可以重复,并且可以根据索引位置进行访问、添加、删除等操作。 List 是一个接口,常用的实现类包括 ArrayList, LinkedList, Vector。 2. 操作List集合的常用方法 2.1 添加元素 …

    Java 2023年5月26日
    00
  • 基于Java实现简单贪吃蛇游戏

    基于Java实现简单贪吃蛇游戏攻略 介绍 贪吃蛇作为一款经典的小游戏,一直受到人们的喜爱,同时也成为了学习编程的入门练手项目。通过这个项目,我们可以了解到Java中关于图形界面、面向对象编程等方面的知识。 实现步骤 设计UI界面:在Java中,常见的UI界面框架有Swing和JavaFX,本项目采用Swing实现。 编写贪吃蛇的逻辑:蛇的移动、食物的随机生成…

    Java 2023年5月26日
    00
  • Java数组队列及环形数组队列超详细讲解

    Java数组队列及环形数组队列超详细讲解 什么是队列 队列(Queue)是一种先进先出(FIFO, first in first out)的数据结构,常见的队列有数组队列和链式队列两种实现方式。 数组队列 数组队列是一种线性结构,底层使用静态数组来存储数据。队列的头部(front)指向队列头部元素,队列尾(rear)指向队列尾部元素。当有新元素入队时,队列尾…

    Java 2023年5月26日
    00
  • Android开发中的文件操作工具类FileUtil完整实例

    下面我会详细讲解“Android开发中的文件操作工具类FileUtil完整实例”的攻略,包含以下几个方面的内容: 简介 文件读取 文件写入 文件复制 文件删除 示例说明 结论 1. 简介 在Android开发中,文件操作时常遇到,因此可以写一个工具类封装常用的文件操作,方便进行文件操作。 2. 文件读取 使用FileInputStream对象打开文件,然后使…

    Java 2023年6月15日
    00
  • 详解Java Streams 中的异常处理

    详解Java Streams 中的异常处理 在 Java 8 中引入了 java.util.stream.Stream 对象,它为我们提供了一种基于lambda表达式的函数式编程方式,方便我们对集合、数组等数据进行快速处理。但是在使用 Stream 进行数据处理的过程中,我们也需要考虑一些异常问题,本文将详细讲解 Java Streams 中的异常处理方案。…

    Java 2023年5月27日
    00
  • 详解Java中的反射机制和动态代理

    详解Java中的反射机制和动态代理 什么是反射机制 反射机制是Java语言中的一种机制,它可以在程序运行时获取一个类的信息,包括类的名称、父类、接口、属性、方法等,还可以在运行时获取和设置对象的属性和方法,创建对象并调用方法。 Java中的反射机制主要包括以下几个类: Class:代表一个类,可以获取一个类的信息,如名称、直接父类、实现的接口、构造方法、属性…

    Java 2023年5月20日
    00
  • Java实时获取基金收益项目源码分享

    Java实时获取基金收益项目源码分享 本文介绍使用Java编写程序实时获取基金收益的方法。用户可以输入基金代码,程序会自动访问天天基金网站获取最新的基金收益数据,并实时展示在命令行窗口中。如果用户需要保存数据,程序还提供了将数据保存为CSV文件的功能。 准备工作 在开始编写Java程序之前,需要安装Java开发环境(JDK)以及Maven构建工具。 下载依赖…

    Java 2023年6月1日
    00
  • Android学习笔记45之gson解析json

    Android学习笔记45之gson解析json 简介 Google推出的Gson是一个使用Java语言实现的Json解析库,可以将Json字符串自动解析成Java对象,或者将Java对象转成Json字符串。在Android开发中,使用Gson解析Json数据是非常常见的操作。本文将介绍Gson解析Json的完整攻略。 配置Gson库 在项目的build.g…

    Java 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部