详解JAVA 线程-线程的状态有哪些?它是如何工作的?

详解JAVA 线程-线程的状态有哪些?它是如何工作的?

线程的状态

Java中的线程状态通常分为以下几种:

  • NEW(新建):新创建了一个线程对象,但还没有调用其start()方法
  • RUNNABLE(可运行):运行状态。线程对象创建后,其他线程调用了该对象的start()方法,该状态的线程位于等待运行队列中,等待获取CPU的使用权
  • BLOCKED(阻塞):线程的阻塞状态。表示线程的阻塞状态,它在等待锁的时候就是这个状态
  • WAITING(等待):线程的等待状态。进入该状态表示当前线程需要等待其他线程做出了一些特定动作(通知、中断等)
  • TIMED_WAITING(计时等待):具有等待时间的等待状态。进入该状态时会等待一段时间,等时间结束或者接收到通知、中断时会重新进入RUNNABLE状态
  • TERMINATED(终止):线程的终止状态。表示该线程已经执行完毕

线程的工作原理

线程是进程中的执行单元,一个进程可以拥有多个线程,每个线程都是独立的,拥有自己的栈、程序计数器和局部变量等。

当线程被创建后,会在内存中分配线程所需要的资源,然后进入NEW状态。当其他线程调用该线程启动方法(start())后,该线程进入RUNNABLE状态,在等待CPU调度的时候位于等待运行队列中。线程调度器会根据调度算法从等待运行队列中选取一个线程,将其转为RUNNING状态并开始执行线程的run()方法。当该线程的run()方法执行结束后,线程进入TERMINATED状态。

在线程的执行过程中,线程可能会进入BLOCKED、WAITING或TIMED_WAITING状态,这些状态的具体原因各异,大多数情况下是因为线程需要等待一些条件的触发(如等待锁、等待输入、等待定时器等)。当条件得到满足后,线程会重新进入RUNNABLE状态,等待CPU调度。

示例说明

示例一

public class ThreadExample1 implements Runnable {
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + " is running!");
    }

    public static void main(String[] args) {
        Thread thread = new Thread(new ThreadExample1());
        System.out.println(thread.getState()); //NEW
        thread.start();
        System.out.println(thread.getState()); //RUNNABLE
    }
}

在示例一中,我们创建了一个实现了Runnable接口的线程类ThreadExample1。在该类的main方法中,我们创建了一个Thread对象并调用start()方法,这将导致该线程进入RUNNABLE状态。在调用start()方法之前,该线程处于NEW状态。

示例二

public class ThreadExample2 implements Runnable {
    private Object lock = new Object();

    @Override
    public void run() {
        synchronized (lock) {
            try {
                lock.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) throws InterruptedException {
        Thread thread = new Thread(new ThreadExample2());
        System.out.println(thread.getState()); //NEW
        thread.start();
        System.out.println(thread.getState()); //RUNNABLE
        Thread.sleep(1000); //等待1秒钟,确保线程已经进入WAITING状态
        System.out.println(thread.getState()); //WAITING
    }
}

在示例二中,我们创建了一个实现了Runnable接口的线程类ThreadExample2。在该类的run方法中,我们使用synchronized关键字进行同步并在lock上等待,这将导致该线程进入WAITING状态。

在main方法中,我们创建了一个Thread对象并调用start()方法,这将导致该线程进入RUNNABLE状态。在start()方法调用之前,该线程处于NEW状态。由于该线程需要等待条件的满足,因此我们调用了Thread.sleep()方法等待1秒钟,以确保该线程已经进入WAITING状态。在等待过程中,我们可以通过getState()方法获取该线程的状态,此时该线程应该处于WAITING状态。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解JAVA 线程-线程的状态有哪些?它是如何工作的? - Python技术站

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

相关文章

  • Java修改maven的默认jdk版本为1.7的方法

    好的。首先需要说明的是,如果你想在Java中使用Maven来构建项目,那么需要确保正确的JDK版本。Java 7对应的JDK版本为1.7.x。而Maven在安装过程中会自动检查系统中已安装的JDK版本,然后默认使用最高版本的JDK,这样就会导致使用Java 7的项目运行时出现问题。下面提供两种方法来修改Maven的默认JDK版本为1.7。 方法一:在Mave…

    Java 2023年5月20日
    00
  • 微信小程序(十五)checkbox组件详细介绍

    微信小程序(十五)checkbox组件详细介绍 简介 checkbox是一种可以在多个选项中单独选择的组件。在微信小程序中使用checkbox组件可以方便地实现多选功能。checkbox组件的主要属性有value、checked、disabled。value代表checkbox的值,checked代表是否选中,disabled代表是否禁用。 基本用法 &lt…

    Java 2023年5月23日
    00
  • java 遍历Map及Map转化为二维数组的实例

    以下是详细的讲解: 遍历Map 在Java中,我们可以使用 java.util.Map 接口来表示键值对的集合。 Map的常用实现类有 HashMap、TreeMap 和 LinkedHashMap。 要遍历Map中的键值对,我们可以使用 entrySet() 方法来遍历Map中的每一个键值对。 示例代码如下: Map<String, String&g…

    Java 2023年5月26日
    00
  • 详解hibernate双向多对多关联映射XML与注解版

    关于“详解hibernate双向多对多关联映射XML与注解版”的攻略,我将从以下几个方面进行详细讲解: 双向多对多关联映射的概念与要素 Hibernate双向多对多关联映射XML版的实现步骤及示例 Hibernate双向多对多关联映射注解版的实现步骤及示例 接下来我会一一进行详细讲解。 一、双向多对多关联映射的概念与要素 双向多对多关联映射,指的是两个实体类…

    Java 2023年5月19日
    00
  • jquery在启动页面时,自动加载数据的实例

    让我为您详细讲解一下“jquery在启动页面时,自动加载数据的实例”的完整攻略。 1. 引入jquery库文件 在网站的HTML文件中需要引入jquery库文件,可以选择在线引入或本地引入。 在线引入: <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min…

    Java 2023年6月15日
    00
  • Spring Boot 入门教程

    SpringBoot入门教程 SpringBoot是一个快速开发、轻量级、微服务框架,它简化了Spring应用的开发过程,提供了自动化配置、可插拔的组件和简化的XML配置等特点,使得SpringBoot成为当前企业级Java应用开发的主流框架之一。本教程旨在帮助读者从入门到掌握SpringBoot,实现快速且高效的应用开发。 环境搭建 在开始使用Spring…

    Java 2023年5月15日
    00
  • 手把手教你写Maven的archetype项目脚手架

    我来为你详细讲解“手把手教你写Maven的archetype项目脚手架”的完整攻略。 什么是Maven的archetype? Maven的archetype是一种脚手架工具,它可以帮助我们快速创建符合规范的Maven项目结构,包含必要的文件和依赖,以满足特定的需求。通常来说,一个archetype文件包含了一个或多个模板(template),这些模板用来生成…

    Java 2023年5月20日
    00
  • SpringBoot 定制化返回数据的实现示例

    下面是关于「SpringBoot 定制化返回数据的实现示例」的完整攻略,包含以下内容: 背景介绍 基本思路 实现步骤 示例说明 背景介绍 在实际开发中,我们经常需要对接口返回数据进行定制化处理。例如,有时候我们需要统一的返回格式、或者在某些接口中需要添加额外的字段信息。这时候,我们就需要对 SpringBoot 中默认的返回数据进行定制化处理。 基本思路 S…

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