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数组与字符串深入探索使用方法

    Java数组与字符串深入探索使用方法 一、数组 1. 定义 Java数组是一个可以容纳固定数量元素的容器,它可以被认为是一个有序的元素列表。数组中的每个元素都有唯一的索引号来标识它们在数组中的位置。数组可以是任何类型,包括基本类型和引用类型。 2. 声明 在Java中,声明一个数组需要指定如下信息:- 数组的类型:数组中元素的类型(int、double、St…

    Java 2023年5月26日
    00
  • Struts2实现CRUD(增 删 改 查)功能实例代码

    实现CRUD(增删改查)功能是Web开发中最基本的功能之一,本文将详细讲解如何使用Struts2框架实现该功能。 步骤一:新建项目并引入依赖 首先,在Eclipse中新建一个动态Web项目,命名为:Struts2CRUD。接着,新增一个名为“lib”的文件夹,用于存放所需的Jar包。然后,将以下Jar包复制到该文件夹中: commons-lang3-x.x.…

    Java 2023年5月20日
    00
  • Spring security基于数据库中账户密码认证

    Spring Security是Spring框架中提供的一个安全权限框架。它将认证(Authentication)和授权(Authorization)抽象为一个独立的模块,可以快速地将安全性集成到应用程序中。Spring Security可以基于多种认证方式,包括基于数据库中账户密码的认证。 基于数据库中账户密码认证的Spring Security攻略如下:…

    Java 2023年5月20日
    00
  • Windows 10上JDK环境安装配置图文教程

    下面是“Windows 10上JDK环境安装配置图文教程”的完整攻略: 1. 下载JDK安装包 首先,你需要下载JDK安装包。此步骤需要在Oracle官方网站上完成。 打开以下链接:https://www.oracle.com/java/technologies/javase-downloads.html 在“Java SE Downloads”页面中,找到…

    Java 2023年5月24日
    00
  • 如何使用Java性能分析工具?

    使用Java性能分析工具是优化Java应用程序性能的重要手段之一。下面是一份Java性能分析工具的使用攻略。 1.选择适合自己的性能分析工具 Java生态系统中有许多性能分析工具,根据具体场景和需求选择合适的工具非常重要。下面是一些常见的Java性能分析工具: JProfiler YourKit Java Profiler VisualVM Java Fli…

    Java 2023年5月11日
    00
  • java 将 list 字符串用逗号隔开拼接字符串的多种方法

    下面是详细讲解“java 将 list 字符串用逗号隔开拼接字符串的多种方法”的完整攻略: 1. 使用 StringJoiner 在 Java 8 中新增了 StringJoiner 类,可以方便地将集合中的元素用指定的分隔符拼接成字符串。示例代码如下: List<String> list = new ArrayList<>(); l…

    Java 2023年5月27日
    00
  • 吃透SpringMVC面试八股文

    说说你对 SpringMVC 的理解 SpringMVC是一种基于 Java 的实现MVC设计模型的请求驱动类型的轻量级Web框架,属于Spring框架的一个模块。 它通过一套注解,让一个简单的Java类成为处理请求的控制器,而无须实现任何接口。同时它还支持RESTful编程风格的请求。 什么是MVC模式? MVC的全名是Model View Control…

    Java 2023年4月20日
    00
  • Java连接操作Oracle数据库代码详解

    Java连接操作Oracle数据库代码详解 简介 Java是一款广泛应用于企业级开发的高级编程语言,而Oracle是一款功能强大的关系型数据库管理系统。在开发过程中,我们经常需要使用Java连接Oracle数据库,并对其进行操作。本文将详细讲解Java连接操作Oracle数据库的代码实现过程。 步骤 1. 准备工作 在开始前,需要确认已经安装好以下两样内容:…

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