【JavaEE】_线程的状态与转移

目录

[1. 线程的状态](#1. 线程的状态)

[1.1 NEW](#1.1 NEW)

[1.2 RUNNABLE](#1.2 RUNNABLE)

[1.3 BLOCKED](#1.3 BLOCKED)

[1.4 WAITING](#1.4 WAITING)

[1.5 TIMED_WAITING](#1.5 TIMED_WAITING)

[1.6 TERMINATED](#1.6 TERMINATED)

[2. 线程状态的转移](#2. 线程状态的转移)


在多线程Thread类相关一文中已经介绍过进程的状态:就绪状态与阻塞状态;

若需详情请查看原文,链接如下:

【JavaEE】_多线程Thread类及其常用方法-CSDN博客

这个状态决定了系统调度进程的态度,但这只针对单线程进程的情况;

但实际中更常见的进程是多线程进程,此时的状态是绑定在线程上的;

其实在Linux操作系统中,PCB是与线程对应的,一个进程对应一组PCB;

"就绪"与"阻塞"状态都是针对系统层面上线程的状态,在java的Thread类中,对于线程的状态又进一步细化了;

1. 线程的状态

1.1 NEW

new表示安排了工作但还未开始行动:

Thread对象创建完成但还没有调用start();

即:Thread对象已经创建完成但内核中还没有线程;

是java内部设置的状态,与操作系统中PCB的状态没有联系;

java 复制代码
Thread t = new Thread(()->{

    });
    //获取指定线程状态
    System.out.println(t.getState());
    t.start();

输出结果为:

1.2 RUNNABLE

runnable表示可工作的,又可分成正在工作中和即将开始工作:即就绪状态

就绪状态包括 ①正在CPU上执行与 ②位于就绪队列中随时可以上CPU执行两种情况;

代码中如果没有sleep或其他可能导致阻塞状态的操作,代码大概率是处在RUNNABLE状态的;

java 复制代码
Thread t = new Thread(()->{
            while(true){
            //处在一个快速高速循环的状态
            }
        });
        t.start();
        System.out.println(t.getState());

输出结果为:

1.3 BLOCKED

表示当前线程在等待锁,导致了阻塞状态(也是属于阻塞的状态之一);

当线程会使用到synchronized对线程进行加锁时会触发线程处于该状态;

后续进行介绍;

1.4 WAITING

表示当前线程在等待唤醒,导致了阻塞状态(也是属于阻塞的状态之一);

当线程使用wait等待唤醒时会触发线程处于该状态;

后续进行介绍;

1.5 TIMED_WAITING

当代码中调用了sleep或是join(等待时间上限),线程就会进入TIME_WAITING状态,表示当前线程在一定时间内处于阻塞状态(也是属于阻塞的状态之一);

java 复制代码
Thread t = new Thread(()->{
            while(true){
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        t.start();
        Thread.sleep(1000);
        System.out.println(t.getState());

输出结果为:

1.6 TERMINATED

terminated表示工作完成了

内核中的PCB已经执行完毕销毁了,但Thread对象仍然存在

实际上内核PCB销毁了,代码中的Thread对象也就没有意义了,

此时为了将该Thread对象标识为无效,设定了Terminated状态;

并且一个线程terminated之后不能再重新start;

java 复制代码
        Thread t = new Thread(()->{

        });
        t.start();
        //并不确定t线程与main线程哪个先执行完毕
        try {
            Thread.sleep(1000);
            //令main线程休眠1s,此时t线程的状态大概率是Terminated
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(t.getState());

输出结果为:

2. 线程状态的转移

在实际开发过程中经常会遇到程序卡死这样的情况,即一些关键的线程阻塞了,此时分析线程阻塞时就可以从线程状态入手进行分析与修正;

相关推荐
离陌在学C#2 小时前
C# 重载与重写:深入理解面向对象编程的核心概念
java·c#
洛阳泰山2 小时前
AI 应用层被 Python 卷成红海,为什么我偏要用 Java 造一个 RAG + 工作流引擎?
java·人工智能·后端
二十雨辰2 小时前
[Java]-Spring面试题
java·开发语言
老马历写记2 小时前
Maven POM 依赖管理总结
java·maven·system·pom·optional
古法安卓2 小时前
Android-车机 GNSS 定位数据接收问题排查
android·java·android studio
蔬菜_2 小时前
前端转全栈-day5(数组、list、set)
java·前端·数据结构·list
萧瑟余晖3 小时前
Java深入解析篇二十二之虚拟线程
java·开发语言
OuO-23 小时前
笔试强训 Day 34:ISBN 号码、kotori 和迷宫、矩阵最长递增路径
java·算法·矩阵
油丶酸萝卜别吃3 小时前
Java 集合类全景介绍
java·开发语言
钱栈up3 小时前
"Flowable 工作流引擎进阶实战(高级篇):任务分配、流程变量与监听器"
java