Java线程(Thread)四种停止方式代码实例

Java线程(Thread)四种停止方式代码实例

在Java语言中,线程是非常常见的概念。在多线程编程过程中,需要经常使用到线程的停止操作。Java线程的停止方法有四种,分别是:

  1. 调用stop方法停止线程
  2. 使用interrupt方法打断线程
  3. 使用volatile布尔变量作为停止标志
  4. 使用线程阻塞等待退出

下面详细介绍这四种方式的代码实例。

1. 调用stop方法停止线程

调用stop方法可以立即终止一个线程,但是该方法已经被标记为过时方法,不建议使用。

public class StopThreadTest extends Thread {
    @Override
    public void run() {
        System.out.println("线程开始执行...");
        // 模拟线程执行耗时操作
        for (int i = 0; i < 1000000; i++) {
            // 模拟线程耗时操作
            Math.random();
        }
        System.out.println("线程执行完毕...");
    }

    public static void main(String[] args) throws InterruptedException {
        StopThreadTest thread = new StopThreadTest();
        thread.start();
        thread.stop(); // 停止线程
        thread.join(); // 等待线程执行完毕
        System.out.println("主线程执行完毕...");
    }
}

在上面的代码中,我们调用stop方法停止了一个执行了一段时间的线程,但是这样的停止方式并不安全,因为调用stop方法会立即终止线程,并且会释放锁,可能会导致数据不一致等问题。

2. 使用interrupt方法打断线程

使用interrupt方法可以打断线程的执行,但是线程并不会立即停止,需要在线程中判断是否被打断并做出相应的处理。

public class InterruptThreadTest extends Thread {
    @Override
    public void run() {
        System.out.println("线程开始执行...");
        try {
            // 模拟线程耗时操作
            for (int i = 0; i < 1000000; i++) {
                if (Thread.interrupted()) {
                    System.out.println("线程被打断,停止执行...");
                    return;
                }
                // 模拟线程耗时操作
                Math.random();
            }
            System.out.println("线程执行完毕...");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) throws InterruptedException {
        InterruptThreadTest thread = new InterruptThreadTest();
        thread.start();
        Thread.sleep(1000); // 等待线程执行一会儿
        thread.interrupt(); // 打断线程
        thread.join(); // 等待线程执行完毕
        System.out.println("主线程执行完毕...");
    }
}

在上面的代码中,我们在线程中判断是否被打断,如果被打断则停止线程的执行。在主线程中运行了一段时间后,我们使用interrupt方法打断了线程的执行,然后使用join方法等待线程执行完毕。

3. 使用volatile布尔变量作为停止标志

使用volatile关键字修饰的布尔变量可以用作线程的停止标志。在线程中判断该标志并作出相应的处理。

public class VolatileThreadTest extends Thread {
    private volatile boolean stopFlag = false;

    public void setStopFlag(boolean stopFlag) {
        this.stopFlag = stopFlag;
    }

    @Override
    public void run() {
        System.out.println("线程开始执行...");
        // 模拟线程耗时操作
        for (int i = 0; i < 1000000; i++) {
            if (stopFlag) {
                System.out.println("线程停止执行...");
                return;
            }
            // 模拟线程耗时操作
            Math.random();
        }
        System.out.println("线程执行完毕...");
    }

    public static void main(String[] args) throws InterruptedException {
        VolatileThreadTest thread = new VolatileThreadTest();
        thread.start();
        Thread.sleep(1000); // 等待线程执行一会儿
        thread.setStopFlag(true); // 停止线程
        thread.join(); // 等待线程执行完毕
        System.out.println("主线程执行完毕...");
    }
}

在上面的代码中,我们使用一个volatile修饰的布尔变量stopFlag作为线程的停止标志。在线程中判断该标志是否为true,如果为true则停止执行。在主线程中运行了一段时间后,我们将stopFlag修改为true,停止线程的执行,然后使用join方法等待线程执行完毕。

4. 使用线程阻塞等待退出

使用Wait和Notify方法可以让线程阻塞并等待通知,从而安全地停止线程。

public class BlockedThreadTest extends Thread {
    private boolean stopFlag = false;

    public synchronized void stopThread() {
        stopFlag = true;
        notify(); // 通知等待的线程
    }

    @Override
    public synchronized void run() {
        System.out.println("线程开始执行...");
        try {
            while (!stopFlag) {
                // 模拟线程耗时操作
                Math.random();
                wait(); // 线程进入等待状态
            }
            System.out.println("线程执行完毕...");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) throws InterruptedException {
        BlockedThreadTest thread = new BlockedThreadTest();
        thread.start();

        Thread.sleep(1000); // 等待线程执行一会儿
        thread.stopThread(); // 停止线程
        thread.join(); // 等待线程执行完毕

        System.out.println("主线程执行完毕...");
    }
}

在上面的代码中,我们使用Wait和Notify方法,让线程阻塞并等待通知。当stopFlag为true时,线程停止等待,退出执行。在主线程中运行了一段时间后,我们调用stopThread方法通知等待的线程停止执行,然后使用join方法等待线程执行完毕。

以上是四种Java线程停止方式的实例代码,每一种方式都有自己的优点和缺点,需要根据实际情况选择合适的停止方式。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java线程(Thread)四种停止方式代码实例 - Python技术站

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

相关文章

  • Java基础之Web服务器与Http详解

    Java基础之Web服务器与Http详解 本文主要讲解Web服务器以及Http协议的相关知识,包括Web服务器如何工作以及Http协议的原理。 Web服务器是什么? Web服务器是一种软件,用于处理客户端(通常是Web浏览器)请求并向客户端发送响应。Web服务器通常指运行HTTP服务器软件的计算机系统。Web服务器可以提供静态文件(如HTML、CSS、Jav…

    Java 2023年5月19日
    00
  • java maven项目如何读取配置文件信息

    要让Java的Maven项目读取配置文件信息,通常有以下几个步骤。 1.将配置文件放置到资源目录下 Maven项目的标准目录结构中,资源文件通常放置在src/main/resources目录下。将配置文件放置到该目录下,可以方便项目的打包和部署。在这个目录下新建一个名为config.properties的配置文件,文件内容如下: database.host=…

    Java 2023年5月19日
    00
  • js表达式计算器代码

    以下是“JS表达式计算器代码”的完整攻略: 概述 JS表达式计算器代码是一个基于JavaScript语言,可以实现简单的表达式计算的小程序。 实现步骤 创建HTML文件,包含输入框、按钮和输出框等必要元素。 编写JavaScript代码,实现计算功能。 获取输入框里的表达式。 利用正则表达式匹配数字和运算符,并将它们保存在数组中。 计算表达式的值。 将计算结…

    Java 2023年6月15日
    00
  • 使用maven一步一步构建spring mvc项目(图文详解)

    使用 maven 一步一步构建 Spring MVC 项目是一个非常常用的开发方式。下面我们来详细讲解这个步骤: 步骤一:新建maven项目 打开 Eclipse 或者 IntelliJ IDEA ,点击 File -> New -> Maven Project; 在弹出的对话框中,选择 Create a simple project ,并勾选上…

    Java 2023年5月16日
    00
  • Java使用NIO优化IO实现文件上传下载功能

    我来为您讲解一下“Java使用NIO优化IO实现文件上传下载功能”的完整攻略。 概述 Java NIO library 是Java语言提供的一种基于缓冲区、非阻塞的IO,使得Java应用程序能够快速轻便地处理并发客户端请求。使用Java NIO实现文件上传下载功能的好处是可以大大提高系统的吞吐量、降低系统的IO延迟,而且还能避免阻塞线程,提高服务器的并发能力…

    Java 2023年5月19日
    00
  • Java实现二叉树的建立、计算高度与递归输出操作示例

    一、建立二叉树 首先定义二叉树节点的数据结构:Node class Node { int value; // 节点值 Node left; // 左子树节点 Node right; // 右子树节点 public Node(int value) { this.value = value; left = null; right = null; } } 使用递归…

    Java 2023年5月19日
    00
  • Sprint Boot @Min使用方法详解

    @Min是Spring Boot中的一个注解,用于标记一个字段或方法参数的值必须大于或等于指定的最小值。在本文中,我们将详细介绍@Min注解的作用和使用方法,并提供两个示例。 @Min注解的作用 @Min注解用于标记一个字段或方法参数的值必须大于或等于指定的最小值。当使用@Min注解标记一个字段或方法参数时,如果该字段或方法参数的值小于指定的最小值,则会抛出…

    Java 2023年5月5日
    00
  • 深入理解java中Arrays.sort()的用法

    当我们需要对Java数组进行排序时,我们可以使用Java API中的Arrays类中的sort()方法。 Arrays.sort()方法概述 Arrays.sort()方法是对Java数组进行排序的方法,它采用了快速排序算法,具有较高的性能。 以下是该方法的语法: public static void sort(Object[] arr) 参数说明 参数ar…

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