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

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

相关推荐
普兰店拉马努金几秒前
【高中数学/古典概率】4红2黑六选二,求取出两次都是红球的概率
java·概率
智商低情商凑几秒前
CAS(Compare And Swap)
java·jvm·面试
yangmf20401 分钟前
使用 Logstash 迁移 MongoDB 数据到 Easysearch
java·elasticsearch·搜索引擎
爱编程的鱼3 分钟前
C# 结构(Struct)
开发语言·人工智能·算法·c#
Tiger_shl4 分钟前
【Python语言基础】24、并发编程
java·数据库·python
FAQEW7 分钟前
Spring boot 中的IOC容器对Bean的管理
java·spring boot·后端·bean·ioc容器
05091513 分钟前
测试基础笔记第十一天
java·数据库·笔记
只可远观15 分钟前
Flutter Dart 循环语句 for while do..while break、continue
开发语言·javascript·ecmascript
IDRSolutions_CN41 分钟前
如何将 PDF 中的文本提取为 JSON 格式
java·经验分享·pdf·软件工程·团队开发
摘星编程1 小时前
并发设计模式实战系列(6):读写锁
java·设计模式·并发编程