Java线程生命周期图文详细讲解

 更新时间:2023年01月27日 10:58:44   作者:健鑫.  
在java中,任何对象都要有生命周期,线程也不例外,它也有自己的生命周期。线程的整个生命周期可以分为5个阶段,分别是新建状态、就绪状态、运行状态、阻塞状态和死亡状态

线程的状态

New

  • 表示线程已创建,没启动的状态
  • 此时已经做了一些准备工作,还没有执行run方法中代码

Runnable

  • 调用start方法之后的状态,表示可运行状态(不一定正在运行,因为调用start方法之后不一定立即运行)
  • 如果线程拿到CPU资源,但是突然资源被抢走,这个线程依然处于Runnable

Blocked

  • 线程进入到被synchronized修饰的代码块时,该锁已经被其他线程拿走,此时该线程处于Blocked
  • Blocked只针对synchronized

Waiting

  • 没有设置时间参数的Object.wait方法可使线程状态变为waiting

Timed Waiting

  • 相对Waiting,有了时间参数

Terminated

  • 执行完毕
  • run方法正常执行完毕
  • 或者出现了一个没有被捕获的异常终止了run方法

代码演示

  • 展示线程的New、Runnable、Terminated状态
  • 线程刚被new处于NEW状态
  • 调用start方法处于RUNNABLE状态
  • 程序正在执行处于RUNNABLE状态而不是RUNNING
  • 程序结束处于TERMINATED状态
public class NewRunnableTerminated implements Runnable {
    public static void main(String[] args) {
        Thread thread = new Thread(new NewRunnableTerminated());
        // 打印线程状态
        // New
        System.out.println(thread.getState());
        thread.start();
        // Runnable
        System.out.println(thread.getState());
//        try {
//            Thread.sleep(100);
//        } catch (InterruptedException e) {
//            e.printStackTrace();
//        }
        // Runnable
        System.out.println(thread.getState());
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        // TERMINATED
        System.out.println(thread.getState());
    }
    @Override
    public void run() {
        for (int i = 0; i < 10000; i++) {
            System.out.println(i);
        }
    }
}
/*
* NEW
RUNNABLE
RUNNABLE
* TERMINATED
* */
  • 演示waiting、Blocked、Timed Waiting
  • 中间频繁调用sleep方法是防止代码执行太快,达不到应有的效果
  • 线程被调用sleep,处于TIMED_WAITING
  • 当一个线程执行synchronized内的代码,另一个线程也要执行则该线程处于BLOCKED
  • 线程执行wait方法,处于WAITING
public class BlockWaitingTimedWaiting implements Runnable{
    public static void main(String[] args) {
        BlockWaitingTimedWaiting blockWaitingTimedWaiting = new BlockWaitingTimedWaiting();
        Thread thread1 = new Thread(blockWaitingTimedWaiting);
        thread1.start();
        Thread thread2 = new Thread(blockWaitingTimedWaiting);
        thread2.start();
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(thread1.getState());
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(thread2.getState());
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(thread1.getState());
    }
    @Override
    public void run() {
        syn();
    }
    private synchronized void syn() {
        try {
            Thread.sleep(1000);
            wait();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
/*
* TIMED_WAITING
BLOCKED
WAITING
* */

阻塞状态

  • 一般而言,Blocked、Waiting、Timed_waiting都被称之为阻塞状态
  • 在阻塞状态下,什么时候可以继续执行是不受控制的

到此这篇关于Java线程生命周期图文详细讲解的文章就介绍到这了,更多相关Java线程生命周期内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java8 将一个List<T>转为Map<String,T>的操作

    Java8 将一个List<T>转为Map<String,T>的操作

    这篇文章主要介绍了Java8 将一个List<T>转为Map<String, T>的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • Java数据结构中图的进阶详解

    Java数据结构中图的进阶详解

    在Java学习与应用中,数据结构无疑是每个人都要接触的难点,为了更好的学习数据结构这一块内容,用图来理解便是最好的方式,让我们一起来了解本篇内容图的进阶
    2022-01-01
  • Mybatis开发要点-resultType和resultMap有什么区别详解

    Mybatis开发要点-resultType和resultMap有什么区别详解

    本文主要介绍了Mybatis开发要点-resultType和resultMap有什么区别详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • JDK8升级JDK17过程中踩到的一些坑

    JDK8升级JDK17过程中踩到的一些坑

    这篇文章主要给大家介绍了关于JDK8升级JDK17过程中踩到的一些坑,对于一些老的项目,升级到JDK8则存在一些兼容性问题,是否升级需要酌情考虑,需要的朋友可以参考下
    2023-07-07
  • SpringBoot JPA出现错误:No identifier specified for en解决方案

    SpringBoot JPA出现错误:No identifier specified&nb

    这篇文章主要介绍了SpringBoot JPA出现错误:No identifier specified for en解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • Java 通过反射给实体类赋值操作

    Java 通过反射给实体类赋值操作

    这篇文章主要介绍了Java 通过反射给实体类赋值操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • Java数组归纳总结

    Java数组归纳总结

    这篇文章主要介绍了Java数组归纳总结,总结内容有一维数组、二维数组、遍历数组、替换元素、数组排序、数组拷贝、元素查询、排序算法,下面来看看这些方法的相关资料,需要的小伙伴可以辛苦一下
    2022-01-01
  • 详解SpringBoot中5种类型参数传递和json数据传参的操作

    详解SpringBoot中5种类型参数传递和json数据传参的操作

    当涉及到参数传递时,Spring Boot遵循HTTP协议,并支持多种参数传递方式,这些参数传递方式可以根据请求的不同部分进行分类,
    2023-12-12
  • PowerJob AbstractSqlProcessor方法工作流程源码解读

    PowerJob AbstractSqlProcessor方法工作流程源码解读

    这篇文章主要为大家介绍了PowerJob AbstractSqlProcessor方法工作流程源码解读,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • Spring Security如何实现升级密码加密方式详解

    Spring Security如何实现升级密码加密方式详解

    这篇文章主要为大家介绍了Spring Security实现升级密码加密方式详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01

最新评论