Java线程状态及切换、关闭线程的正确姿势分享

以下是关于Java线程状态及切换、关闭线程的完整攻略。

Java线程状态

Java线程有以下几种状态:

  • NEW(新建):线程刚被创建,但是还未开始执行。
  • RUNNABLE(运行):线程正在执行或等待CPU资源分配。
  • BLOCKED(阻塞):线程等待获取锁以进入同步区域时被阻塞。
  • WAITING(等待):线程等待其他线程执行特定操作通知它继续执行。
  • TIMED_WAITING(计时等待):线程等待其他线程执行特定操作通知它继续执行,该状态具有等待时间限制。
  • TERMINATED(终止):线程执行完毕。

Java线程状态切换

  • 新建线程 -> 就绪线程:当线程创建,但尚未调用 start() 方法启动线程时,处于新建状态。当调用 start() 方法后,线程进入就绪状态,等待获取CPU时间片。
  • 就绪线程 -> 运行线程:当某一线程获得CPU时间片后,便进入运行状态,开始执行 run() 方法中的代码。
  • 运行线程 -> 休眠状态:当线程运行时调用 Thread.sleep() 方法,或等待 IO 完成等操作时,使线程进入休眠状态。
  • 运行线程 -> 阻塞状态:当线程需要等待某个锁的释放时,会进入阻塞状态。例如synchronized代码块或 synchronized 关键字修饰的方法。
  • 运行线程 -> 死亡状态:当 run() 方法执行完毕或通过调用 stop() 方法强制性停止线程时,线程进入死亡状态。

关闭线程,正确的姿势分享

关闭线程的方法

  • 调用线程对象的 interrupt() 方法:在正常的情况下,线程会通过while循环里的wait()等方法进入等待状态,所以我们可以通过调用 interrupt() 方法使线程“醒来”,让线程自己判断是否需要结束。
Thread.currentThread().interrupt();
  • 使用简单标志位终止线程:开辟一个 boolean 类型的变量标志着线程应该退出。
public class MyRunnable implements Runnable {

    private volatile boolean isRunning = true;

    @Override
    public void run() {
        while (isRunning) {
            // while循环内的代码
            System.out.println("线程执行");
        }
    }

    public void stopRunning() {
        this.isRunning = false;
    }
}

示例说明

关闭线程示例一:使用interrupt()方法关闭线程

public class MyThread extends Thread {
    @Override
    public void run() {
        try {
            while (!Thread.currentThread().isInterrupted()){
                System.out.println("线程正在运行");
                Thread.sleep(1000); // 线程休眠1秒
            }
        } catch (InterruptedException e) {
            System.out.println("线程被中断");
        }
    }

    public static void main(String[] args) {
        MyThread thread = new MyThread();
        thread.start();
        try {
            Thread.sleep(5000); //主线程休眠5秒
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        thread.interrupt(); //调用interrupt()方法,关闭线程
    }
}

当主线程执行打印主方法中的代码后,开启一个MyThread线程,MyThread线程会隔一秒打印"线程正在运行",此时主线程休眠五秒,之后调用MyThread线程的 interrupt() 方法结束线程。最后在catch块中打印“线程被中断”,这样线程就被成功关闭了。

关闭线程示例二:使用标志位终止线程

public class MyRunnableExample {
    public static void main(String[] args) throws InterruptedException {
        MyRunnable myRunnable = new MyRunnable();
        Thread thread = new Thread(myRunnable);
        thread.start();  //开始启动线程
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        myRunnable.stopRunning(); //设置标志位为false,关闭线程
    }
}

该示例中首先创建一个 MyRunnable 对象并创建线程,在 MyRunnable 类的 run() 方法中使用 while 循环无限次运行,直到 isRunning 标志位变为 false。在主线程让它休眠 5 秒后,用 stopRunning() 方法将 isRunning 标志位置为 false,线程也就会自然终止了。

总的来说,本篇攻略详细介绍了 Java 线程的状态及切换,以及如何正确地关闭线程,分别使用 interrupt() 方法和标志位两种方式来示范。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java线程状态及切换、关闭线程的正确姿势分享 - Python技术站

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

相关文章

  • 详解Java中数组判断元素存在几种方式比较

    详解Java中数组判断元素存在几种方式比较 在Java编程中,需要经常判断一个元素是否存在于数组中。本篇攻略将详细讲解Java中数组判断元素是否存在的几种方式比较。 方式一:使用循环遍历数组 使用循环遍历数组是最常见的一种判断元素是否存在的方式。具体过程如下: public boolean isExist(int[] arr, int k) { for (i…

    Java 2023年5月26日
    00
  • Java日常练习题,每天进步一点点(36)

    下面我将详细讲解一下“Java日常练习题,每天进步一点点(36)”的完整攻略。 标题 在攻略的开头,需要加上一个一级标题,表示主题: Java日常练习题,每天进步一点点(36)攻略 理解题意 在开始解答编程题之前,需要先仔细阅读题目,理解题意。这个步骤非常重要,因为只有理解了题目的意思,才能写出正确的代码。 解决问题 了解了题意之后,需要分析如何解决这个问题…

    Java 2023年5月19日
    00
  • 详解SpringMVC 自动封装枚举类的方法

    以下是关于“详解SpringMVC 自动封装枚举类的方法”的完整攻略,其中包含两个示例。 详解SpringMVC 自动封装枚举类的方法 在SpringMVC中,我们可以使用自动封装枚举类的方法来简化代码。在本文中,我们将讲解如何使用自动封装枚举类的方法来简化SpringMVC代码。 自动封装枚举类的方法 在SpringMVC中,我们可以使用自动封装枚举类的方…

    Java 2023年5月17日
    00
  • SpringBoot 注解事务声明式事务的方式

    下面是详细讲解SpringBoot注解事务声明式事务的方式的完整攻略。 什么是事务 在数据库的操作中,当多条SQL语句同时执行时,为了保证数据的一致性和完整性,我们需要让这些SQL语句在一个整体中完成,有且只有所有语句都执行成功时才提交到数据库里,而任一条语句执行失败时则所有语句都不会被提交。这个整体操作就是“事务”。 在Java中,事务可以通过编程式、声明…

    Java 2023年5月15日
    00
  • Java之String类型的编码方式转换

    下面是“Java之String类型的编码方式转换”的完整攻略。 前言 在日常编程中,我们常常需要对字符串的编码方式进行转换。例如:我们从网络获取到的数据一般是以UTF-8编码的字符串,但是在本地的操作系统中,一些字符可能使用的是GBK编码。这个时候,我们就需要进行编码方式的转换,以保证数据的正确性。在Java中,我们可以使用String类的getBytes(…

    Java 2023年5月20日
    00
  • SpringBoot 集成 activiti的示例代码

    以下是Spring Boot集成Activiti的示例代码攻略: 添加依赖项 首先,我们需要在pom.xml文件中添加Activiti和Spring Boot Starter依赖项: <dependency> <groupId>org.activiti</groupId> <artifactId>activit…

    Java 2023年5月14日
    00
  • SSH框架网上商城项目第7战之整合Struts2和Json

    下面是 “SSH框架网上商城项目第7战之整合Struts2和Json”的完整攻略: 1. 概述 本文是在使用SSH框架搭建在线商城的基础上,介绍了如何整合Struts2和Json来实现后端与前端之间的数据交互。 2. 安装插件 首先,我们需要在项目中引入Struts2和Json插件,可以在pom.xml文件中添加以下依赖: <dependency&gt…

    Java 2023年5月20日
    00
  • 关于jsp版ueditor1.2.5的部分问题解决(上传图片失败)

    关于jsp版ueditor1.2.5的部分问题解决(上传图片失败)攻略可以按照以下步骤进行: 1. 修改配置文件 打开ueditor.config.js文件,将serverUrl修改为你后端处理上传请求的路径。例如: window.UEDITOR_CONFIG = { …, serverUrl: ‘uploadImage.jsp’ } 其中,upload…

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