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

yizhihongxing

详解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日

相关文章

  • Springmvc自定义异常处理器实现流程解析

    一、Springmvc自定义异常处理器实现流程解析 在Springmvc中,我们可以自定义异常处理器来处理系统中出现的异常,以下是Springmvc自定义异常处理器的实现流程: 编写自定义异常类 首先,我们需要定义一个自己的异常类,可以继承Exception或RuntimeException,该异常类作为处理异常时的标识。 public class MyEx…

    Java 2023年5月27日
    00
  • springmvc利用jquery.form插件异步上传文件示例

    针对你的问题,我可以提供以下完整攻略,希望能够帮助你。 一、简介 在web应用中,文件上传功能是比较常见的。而在Spring MVC框架中,文件上传则可以通过SpringMVC提供的MultipartHttpServletRequest类来完成,但是这种方式需要整个页面提交才能上传文件,速度比较慢,因此在前端使用异步上传文件功能可以大幅提升用户体验。而jqu…

    Java 2023年5月31日
    00
  • kafka消费不到数据的排查过程

    当Kafka的消费者不能消费数据时,我们需要按以下步骤排查故障: 1. 检查主题和分区 首先,确保您有访问消费者订阅的主题和分区的权限。您可以使用以下命令来验证消费者是否订阅了正确的主题和分区: $ bin/kafka-consumer-groups.sh –bootstrap-server localhost:9092 –describe –grou…

    Java 2023年5月20日
    00
  • 彻底解决tomcat中文乱码问题方案

    下面是彻底解决Tomcat中文乱码问题的完整攻略。 问题描述 在Tomcat中,有时候我们会遇到中文乱码的问题,这个问题主要是由于Tomcat默认的编码格式不是UTF-8,导致其无法正常识别中文字符。 解决方案 要解决Tomcat中文乱码问题,可以采用以下两种方法。 方法一:在Tomcat的conf目录中添加”setenv.sh”文件 在Tomcat的con…

    Java 2023年5月19日
    00
  • 基于SpringMVC实现网页登录拦截

    基于SpringMVC实现网页登录拦截 本文将详细讲解如何使用SpringMVC实现网页登录拦截,并提供两个示例说明。 环境准备 在开始实现网页登录拦截之前,我们需要准备以下环境: JDK 18或以上版本 Maven 3.6.3或以上版本 Tomcat 9.0或以上版本 实现步骤 下面是实现网页登录拦截的详细步骤: 步骤一:创建Maven项目 首先,我们需要…

    Java 2023年5月17日
    00
  • 详解Java中数组判断元素存在几种方式比较

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

    Java 2023年5月26日
    00
  • Java 中的类和对象详情

    下面是Java 中的类和对象详情的完整攻略。 1. 什么是类和对象 Java 中的类是一个可以实例化的模板,描述了一组具有相同属性和方法的对象集合。在面向对象的编程中,类是创造对象的基础,包含了对象的定义和初始化信息。而对象则是类的一个实例化,是具有独立标识的实体。 2. 如何定义类 2.1 类的声明 类的声明由 class 关键字、类名、类体组成。类体包含…

    Java 2023年5月26日
    00
  • java HttpClient传输json格式的参数实例讲解

    Java HttpClient传输JSON格式参数实例讲解 1. 什么是HttpClient HttpClient是一个HTTP客户端工具包,Apache HttpClient的封装版本是阿希替(AxTire)HTTP Client。 HttpClient我们可以用它来模拟浏览器的请求,实现登录、提交表单、发送请求等功能,适用于各种简单和复杂的操作。 2. …

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