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

yizhihongxing

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日

相关文章

  • js实现定时进度条完成后切换图片

    下面是实现”js实现定时进度条完成后切换图片”的完整攻略。 目录 1.需求分析 2.方案设计 3.实现步骤 4.示例说明 4.1 示例1:进度条倒计时 4.2 示例2:图片切换 1.需求分析 我们需要实现一个功能,当用户进入页面时,能够显示一个进度条,并在进度条走完后自动切换到下一张图片。 2.方案设计 根据需求,我们需要实现以下几个功能: 显示进度条 进度…

    Java 2023年6月16日
    00
  • Spring 与 JDK 线程池的简单使用示例详解

    下面是Spring与JDK线程池的简单使用示例详解的攻略。 Spring与JDK线程池的简单使用示例详解 什么是线程池 线程池是一种多线程的解决方案,它的核心思想是在应用程序启动的时候,提前创建若干个线程并放入线程池中,并维护这些线程的生命周期,应用程序需要处理任务的时候,不需要再临时创建新的线程,而是从线程池中获取可用的线程。 JDK线程池的使用 Java…

    Java 2023年5月18日
    00
  • java使用POI实现html和word相互转换

    针对“java使用POI实现html和word相互转换”的问题,我来详细讲解一下。 一、实现思路 POI 是 Apache 开源的用于操作 Microsoft Office 二进制文件格式的 Java API,它可以读取和写入 Excel、Word 和 PowerPoint 等文件。利用 POI,我们可以方便地将 word 和 html 相互转换。 具体实现…

    Java 2023年5月20日
    00
  • Java利用文件输入输出流实现文件夹内所有文件拷贝到另一个文件夹

    这里简要讲解一下如何使用Java的文件输入输出流实现文件夹内所有文件拷贝到另一个文件夹。 用途 该功能可帮助用户将一个文件夹里的所有文件拷贝到另一个目录下,实现备份和移植数据的功能。 实现步骤 实现该功能需要以下几个步骤: 找到源文件夹和目标文件夹 获取源文件夹下的所有文件及文件夹 遍历源文件夹下的每个文件,若是文件则新建文件并写入,若是文件夹则递归调用本身…

    Java 2023年5月26日
    00
  • 详解Struts2标签遍历

    当开发使用Struts2进行Web项目时,标签的使用可以大大提升开发效率。而Struts2提供了众多的标签,其中遍历标签可以用于处理集合或数组等数据类型。接下来,我将针对Struts2标签遍历进行详细讲解,帮助大家更好地使用它。 Struts2标签遍历 Struts2标签遍历是用于遍历集合或数组等数据类型的标签。它提供了多种不同的方式来展示这些数据,如表格、…

    Java 2023年5月20日
    00
  • html css将表头固定的最直接的方法

    要将表头固定,最直接的方法是使用CSS中的position属性和z-index属性。具体步骤如下: HTML结构 首先,我们需要在HTML结构中将表格分为两部分:表头和表体。表头使用 标签,表体使用 标签。代码示例如下: <table> <thead> <tr> <th>姓名</th> <th…

    Java 2023年6月15日
    00
  • 基于Java ORM框架的使用详解

    下面是关于“基于Java ORM框架的使用详解”的完整攻略。 一、了解ORM框架 ORM(对象关系映射)框架是为了方便Java程序员操作数据库而生的工具,它将Java对象与数据库表之间建立映射关系,通过操作Java对象的属性,实现对数据库表的增、删、改、查等操作。 常见的Java ORM框架有Hibernate、MyBatis、JPA等。其中,Hiberna…

    Java 2023年5月20日
    00
  • Springboot实现根据用户ID切换动态数据源

    下面详细讲解一下Spring Boot实现根据用户ID切换动态数据源的完整攻略。 1. 背景介绍 在一些需要多数据源分库分表的项目中,我们需要根据用户ID来动态切换数据源。比如将同一张表中不同用户的数据划分到不同的数据库中进行存储,这样可以有效地降低数据库的负载,提高系统的性能。 2. 实现步骤 2.1 引入相关依赖 我们可以通过引入Spring Boot的…

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