Java线程的6种状态及切换教程

Java线程的6种状态及切换教程

Java是一种多线程编程语言,线程作为Java应用程序的基本执行单元,线程状态经常改变。正因为Java线程状态的改变,在多线程程序中使用线程,需要了解线程的6种状态及状态转换。本文将通过以下几个方面详细讲解Java线程的6种状态及状态转换的教程。

Java线程的6种状态

Java线程共有6种状态,分别是:

  • NEW(新建):线程被创建但尚未开始执行的状态。
  • RUNNABLE(就绪):线程执行所需的所有资源已准备就绪,线程等待调度执行的状态。
  • BLOCKED(阻塞):线程正在等待获取锁对象,此时其他线程获取到锁对象,并且线程的等待时间未到,线程会处于阻塞状态。
  • WAITING(等待):线程等待其他线程执行完成,进入等待状态。
  • TIMED_WAITING(定时等待):线程等待其他线程执行完成在指定时间内,定时等待状态。
  • TERMINATED(终止):线程执行完成或被中断结束的状态。

Java线程状态的转换

不同状态的线程可以相互转换。Java线程状态转换的条件如下:

  • 新建状态转换为可运行状态:调用线程start() 方法。
  • 就绪状态转换为运行状态:获得cpu时间片,开始执行代码。
  • 运行状态转换为就绪状态:当前线程的时间片用完或者线程sleep() 方法执行完毕。
  • 运行状态转换为阻塞状态:线程在synchronized()方法上未获得锁的情况下执行wait()或者别的类似方法时,线程就会进入阻塞状态。
  • 阻塞状态转换为就绪状态:线程获得锁并执行notify或者notifyAll()方法,线程返回就绪状态。
  • 运行状态和就绪状态线程转化为等待或者定时等待线程:执行wait()或sleep(time)或join(time)方法,进入等待或定时等待状态。
  • 等待或定时等待线程状态转换为就绪状态:等待或定时等待时间到,或唤醒该线程。

Java线程状态转换示例

示例1:线程转换为阻塞状态

public class Demo1 implements Runnable {
    public synchronized void run() {
        try {
            System.out.println(Thread.currentThread().getName()
                    + "占用资源,等待5s");
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) throws Exception{
        Demo1 demo1 = new Demo1();
        Thread t1 = new Thread(demo1, "线程1");
        Thread t2 = new Thread(demo1, "线程2");
        t1.start();
        Thread.sleep(1000);
        t2.start();
    }
}

运行结果:

线程1占用资源,等待5s
线程2占用资源,等待5s

我们会发现线程2没有在开始执行,而是正在等待资源,则在这个过程中线程2就处于阻塞状态了。

示例2:线程转换为等待状态

public class Demo2 {
    public static void main(String[] args) throws Exception{
        Object object = new Object();
        Thread t1 = new Thread(() -> {
            synchronized (object) {
                try {
                    System.out.println(Thread.currentThread().getName()
                            + " enter waiting state");
                    object.wait();
                    System.out.println(Thread.currentThread().getName()
                            + " restart execution");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }, "线程1");

        Thread t2 = new Thread(() -> {
            synchronized (object) {
                System.out.println(Thread.currentThread().getName() + " notify");
                object.notify();
            }
        }, "线程2");

        t1.start();
        Thread.sleep(1000L);
        t2.start();
    }
}

运行结果:

线程1 enter waiting state
线程2 notify
线程1 restart execution

如上,t1线程执行了object.wait()方法,导致线程进入等待状态,同时在t2线程中synchronized(object)代码块调用了object.notify()方法,唤醒了等待的线程t1,此时t1线程就处于就绪状态了。

总结

本文对Java线程的6种状态及状态转换进行了详细的讲解,并通过两个示例进行了演示,希望读者可以通过本文更深刻的理解Java的多线程编程思想。

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

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

相关文章

  • java8中的lambda表达式简介

    首先我们来介绍一下Java 8中的Lambda表达式。Lambda表达式是一种新的语言特性,也是Java 8引入的最为重要的新特性之一。它简化了代码编写的难度,可以使代码更加简洁、易读。在Java 8之前,“匿名内部类”是开发人员实现不同功能所必须使用的主要方式。但是,使用匿名内部类的语法造成了很多冗余的代码,让代码可读性下降,而使用Lambda表达式可以使…

    Java 2023年5月26日
    00
  • springMVC解决ajax请求乱码的三种方法

    在Spring MVC中,当使用Ajax发送请求时,可能会出现中文乱码的问题。这是因为Ajax默认使用UTF-8编码,而Spring MVC默认使用ISO-8859-1编码。为了解决这个问题,我们可以采取以下三种方法: 1. 使用过滤器 我们可以使用过滤器来解决Ajax请求中文乱码的问题。在过滤器中,我们可以将请求和响应的编码都设置为UTF-8。 下面是一个…

    Java 2023年5月18日
    00
  • Java的Struts框架报错“ActionTokenException”的原因与解决办法

    当使用Java的Struts框架时,可能会遇到“MappingNotFoundException”错误。这个错误通常由以下原因之一起: 配置错误:如果配置文件中没有正确配置,则可能会现此错误。在这种情况下检查文件以解决此问题。 URL错误:如果URL不正确,则可能会出现此错误。在这种情况下,需要检查URL以解决此问题。 以下是两个实例: 例 1 如果配置文件…

    Java 2023年5月5日
    00
  • java SpringMvc中拦截器的应用

    Java Spring MVC中拦截器的应用 拦截器是Spring MVC框架中的一个重要组件,它可以在请求到达控制器之前或之后执行一些操作。在本文中,我们将详细介绍Java Spring MVC中拦截器的应用。 步骤一:创建拦截器类 在Java Spring MVC中,我们可以通过实现HandlerInterceptor接口来创建拦截器类。我们可以在“sr…

    Java 2023年5月17日
    00
  • Java 8中 Stream小知识小技巧方法梳理

    Java 8中 Stream小知识小技巧方法梳理 什么是Stream Stream是Java 8中的新特性,它能够处理大批量的数据,并且可以并发处理数据,极大地提升了Java程序的性能。Stream与Java中的集合类(如List、Set、Map等)不同之处在于,它并不直接存储数据,而是对数据进行处理。 Stream的原理 Stream中的数据是以流的方式进…

    Java 2023年5月26日
    00
  • Java 实现Redis存储复杂json格式数据并返回给前端

    实现Redis存储复杂json格式数据并返回给前端需要经过以下步骤: 1. 安装Redis和Java Redis客户端 Redis可以在官网下载最新版的安装文件,Redis的Java客户端可以使用Jedis和Lettuce。 2. 创建Java Redis连接 使用Jedis或Lettuce,创建Redis连接对象,连接Redis数据库,并获取Redis的操…

    Java 2023年5月26日
    00
  • SpringMVC 如何使用注解完成登录拦截

    在SpringMVC中,我们可以使用注解来完成登录拦截。本文将详细介绍如何使用注解完成登录拦截,并提供两个示例说明。 实现步骤 步骤一:添加依赖 首先,我们需要在项目中添加Spring Security的依赖。可以通过以下方式添加: <dependency> <groupId>org.springframework.security&…

    Java 2023年5月17日
    00
  • IDEA配置java开发环境(maven、gradle、tomcat)

    下面是详细的攻略: IDEA配置Java开发环境(maven、gradle、tomcat) 环境准备 在开始配置Java开发环境之前,请确保你已经完成以下准备工作: 已下载并安装了Java Development Kit(JDK) 已下载并安装了IntelliJ IDEA 配置Maven 1. 安装Maven 首先需要在Maven的官网https://mav…

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