【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 分钟前
Python 大数据展示屏实例
大数据·开发语言·python
让学习成为一种生活方式7 分钟前
R包下载太慢安装中止的解决策略-R语言003
java·数据库·r语言
晨曦_子画13 分钟前
编程语言之战:AI 之后的 Kotlin 与 Java
android·java·开发语言·人工智能·kotlin
Black_Friend21 分钟前
关于在VS中使用Qt不同版本报错的问题
开发语言·qt
南宫生36 分钟前
贪心算法习题其三【力扣】【算法学习day.20】
java·数据结构·学习·算法·leetcode·贪心算法
希言JY1 小时前
C字符串 | 字符串处理函数 | 使用 | 原理 | 实现
c语言·开发语言
残月只会敲键盘1 小时前
php代码审计--常见函数整理
开发语言·php
xianwu5431 小时前
反向代理模块
linux·开发语言·网络·git
Heavydrink1 小时前
HTTP动词与状态码
java
ktkiko111 小时前
Java中的远程方法调用——RPC详解
java·开发语言·rpc