详解Java的线程状态

Java中的线程可以处于不同的状态,包括NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING和TERMINATED。了解这些状态及其转换对于优化并发程序和解决并发问题非常重要。以下是详解Java的线程状态的完整攻略:

线程的状态

  • NEW:创建一个线程对象,但是还没有调用start方法时,线程对象的状态是NEW。
  • RUNNABLE:一旦调用start方法,线程就进入RUNNABLE状态。在这个状态下,线程可以被CPU分配时间片,执行任务。但是,需要注意的是,RUNNABLE状态下的线程可能没有获取到锁,也可能在等待某个资源,等待时间片分配,或者被其他线程阻塞。
  • BLOCKED:当线程在等待获得锁、等待I/O事件完成等原因时,就会进入BLOCKED状态。在这个状态下,线程会永远等待当前需要的资源被释放。
  • WAITING:当线程在等待某个其他线程通知被通知之前,可以处于WAITING状态。在这个状态下,线程是无限期等待,直到获取到通知。
  • TIMED_WAITING:当线程在等待某个其他线程通知被通知之前,可以处于TIMED_WAITING状态,这个状态下线程等待一定的时间,并且会在等待超时或者获取到通知之前被唤醒。
  • TERMINATED:线程运行结束后,进入TERMINATED状态。

线程状态转换

Java线程的状态可以通过调用以下方法实现:

  • Thread.sleep(long millis)
  • Object.wait()
  • Object.wait(long timeout)
  • Thread.yield()
  • LockSupport.park()
  • LockSupport.unpark(Thread thread)

示例1

public class ThreadStatusDemo {

    public static void main(String[] args) {
        Thread t1 = new Thread(() -> {
            synchronized (ThreadStatusDemo.class) {
                try {
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        System.out.println("t1 state: " + t1.getState()); // NEW
        t1.start(); 
        System.out.println("t1 state: " + t1.getState()); // RUNNABLE
        synchronized (ThreadStatusDemo.class) {
            System.out.println("t1 state: " + t1.getState()); // BLOCKED
        }
        try {
            Thread.sleep(4000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("t1 state: " + t1.getState()); // TERMINATED
    }
}

在这个示例中,线程t1开始于NEW状态,实际上它仅被创建,没有开始运行。调用start方法后,它进入了RUNNABLE状态,准备运行。在synchronized块中获得锁的代码中,t1将进入BLOCKED状态。几秒钟后,线程结束并进入TERMINATED状态。

示例2

public class ThreadStatusDemo2 {

    public static void main(String[] args) {
        Thread t1 = new Thread(() -> {
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });

        Thread t2 = new Thread(() -> {
            synchronized (ThreadStatusDemo2.class) {
                try {
                    ThreadStatusDemo2.class.wait(); // 等待被通知
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });

        t1.start();
        t2.start();

        System.out.println("t1: " + t1.getState()); // RUNNABLE
        System.out.println("t2: " + t2.getState()); // BLOCKED

        try {
            Thread.sleep(3000); // 等待t1和t2都得到时间片执行
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("t1: " + t1.getState()); // TERMINATED
        synchronized (ThreadStatusDemo2.class) {
            ThreadStatusDemo2.class.notify(); // 通知t2
        }
        System.out.println("t2: " + t2.getState()); // TERMINATED
    }
}

在这个示例中,线程t1被创建并启动后,进入RUNNABLE状态,t2在synchronized块中等待调用notify或notifyAll方法,进入了WAITING状态。注意,使用wait方法需要获取该对象的监视器(即锁)。几秒钟后,t1结束并进入TERMINATED状态。接着,t2被通知并结束进入TERMINATED状态。

以上是详解Java的线程状态的完整攻略,理解线程状态及其转换过程是学习Java中并发编程的重要一步。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解Java的线程状态 - Python技术站

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

相关文章

  • Spring Boot 简介(入门篇)

    SpringBoot简介(入门篇) 什么是SpringBoot Spring Boot 是一个用于快速创建 Spring 应用程序的框架。它基于 Spring 框架,遵循“约定优于配置”的原则,提供了很多默认配置,简化了 Spring 应用程序的开发过程。 SpringBoot的优点 快速开发: Spring Boot 可以快速创建独立运行的 Spring …

    Java 2023年5月15日
    00
  • Java如何发起http请求的实现(GET/POST)

    下面是详细的Java发起HTTP请求的实现攻略: 1. 准备工作 在Java中发起HTTP请求需要使用到java.net包中的一些类和方法。因此,我们需要先导入以下两个类: import java.net.HttpURLConnection; import java.net.URL; 2. 发起GET请求 下面我们通过一个简单的示例来讲解如何使用Java发起…

    Java 2023年5月26日
    00
  • SpringBoot配置拦截器方式实例代码

    下面是SpringBoot配置拦截器的实现详细攻略: 1. 编写拦截器类 首先,我们需要编写一个拦截器类,实现HandlerInterceptor接口,拦截请求前和请求后的操作。以下是一个示例: public class LoginInterceptor implements HandlerInterceptor { @Override public boo…

    Java 2023年5月20日
    00
  • java排序去重示例分享

    请允许我详细讲解“java排序去重示例分享”的完整攻略。 1. 确定需求 首先,我们需要确定这个示例的需求:要对一个数组进行排序,并去重。 2. 准备数据 准备一个整型数组,作为示例代码的输入数据: int[] arr = {3, 8, 5, 2, 4, 3, 9, 1, 5, 4}; 3. 排序算法 用Java的Arrays类对数组进行排序,示例代码如下:…

    Java 2023年5月26日
    00
  • 使用Tomcat Native提升Tomcat IO效率的方法详解

    使用Tomcat Native提升Tomcat IO效率的方法详解 什么是Tomcat Native Tomcat Native是一个可选组件,它提供了使用操作系统本地库来优化Tomcat的I/O性能的功能。通过使用Tomcat Native,Tomcat服务器能够基于操作系统优化的IO处理提高性能。 安装Tomcat Native 要使用Tomcat Na…

    Java 2023年5月19日
    00
  • 将java项目打包成exe可执行文件的完整步骤

    将Java项目打包成exe可执行文件的步骤如下: 准备工作: 安装好Java开发环境(JDK) 打包工具 jpackage 构建可执行jar包: 在Java项目中,使用 maven 或 gradle 等构建工具,构建可执行的 jar 包 如果没有使用构建工具,可以使用以下命令构建可执行 jar 包: jar cvfe MyApp.jar com.exampl…

    Java 2023年5月19日
    00
  • 手把手教你怎么创建spring项目

    创建Spring项目的步骤如下: 步骤一:安装IDE 首先,我们需要在本地安装一个IDE(Integrated Development Environment),例如Eclipse、IntelliJ IDEA、Spring Tool Suite等。这里以Eclipse为例进行讲解。进入Eclipse,按照提示进行安装和配置即可。 步骤二:创建Maven工程 …

    Java 2023年5月20日
    00
  • java 抛出异常处理的方法

    Java 是一门强类型的面向对象编程语言,拥有强大的异常处理机制。在实际的编码过程中,异常处理一直是开发者必备的技能。本文将详细介绍 Java 抛出异常处理的方法。 1. 异常 异常即 Java 中不正常的情况,是指代码执行过程中,出现了异常事件,导致了程序的中断、退出或者崩溃等情况。Java 中将异常分为三类:受检异常、非受检异常和错误。 受检异常:编译器…

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