【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. 线程状态的转移

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

相关推荐
Wish3D38 分钟前
阿里云OSS 上传文件 Python版本
开发语言·python·阿里云
凤年徐38 分钟前
【数据结构初阶】单链表
c语言·开发语言·数据结构·c++·经验分享·笔记·链表
oioihoii40 分钟前
C++11 右值引用:从入门到精通
开发语言·c++
朝新_4 小时前
【多线程初阶】阻塞队列 & 生产者消费者模型
java·开发语言·javaee
立莹Sir4 小时前
Calendar类日期设置进位问题
java·开发语言
风逸hhh5 小时前
python打卡day46@浙大疏锦行
开发语言·python
火兮明兮5 小时前
Python训练第四十三天
开发语言·python
季鸢5 小时前
Java设计模式之状态模式详解
java·设计模式·状态模式
@yanyu6666 小时前
springboot实现查询学生
java·spring boot·后端
ascarl20106 小时前
准确--k8s cgroup问题排查
java·开发语言