JavaEE初阶--线程的状态

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


前言

上节我们讲解了Thread类的方法和属性:如开始一个线程的方法start(),中断一个线程interrupted()......等等,今天我们就将一下线程的几种状态吧。开始我们的正文吧。

一、线程的状态

前面我们已经说过了进程的状态分为:1.就绪。2.阻塞。

这是从操作系统的视角来看待的。Java线程也是对操作系统线程的分装,

针对状态这里,Java也进行了重新分装,进行表示。

因为线程的状态是一个枚举类型Thread.State,所以我们可以通过一段代码来进行展示Java线程所以的状态。

java 复制代码
public class demo9 {
    public static void main(String[] args) {
        for (Thread.State state : Thread.State.values()){
            System.out.println(state);
        }
    }
}

争对上述的线程状态,我们一个一个来进行讲解。

  • NEW 安排了工作,还未开始行动 ,new了Thread对象,还没有start()
  • TERMINATED 工作完成了。内核中的线程已经结束了,但是Thread对象还在
java 复制代码
public static void main(String[] args) throws InterruptedException {
        Thread t = new Thread(() -> {
            while (true) {
                // 在这里啥都不做
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
        });

        System.out.println(t.getState());

        t.start();

        Thread.sleep(1000);
        System.out.println(t.getState());
    }
  • RUNNABLE:可工作的,又可以分成正在工作中和即将开始工作。

在线程中就是**就绪状态:1)线程正在CPU上执行,**比如:我正在和一个A姐姐约会的这个状态。

2)线程随时可以去CPU上执行。A没有出差,她可以随叫随到的状态。

  • BLOCKED、WAITING:这两个都表示排队等着其他事情。
  • TIMED_WAITING:这和上面两个都表示排队等着其他事情。

但是能指定时间的阻塞,

线程阻塞(不参与cpu调度,不继续执行了,

阻塞的时间是有上限的。

本身也是一段cpu指令,一直循环执行,也是需要在cpu上运行的。

另外,join(时间)也是会进入到TIMED_WAITING状态

大家不要被这个状态转移图吓到,我们重点是要理解状态的意义以及各个状态的具体意思。

我们举个例子:我的导师给我安排了工作,但我只是接收了导师发的Email,我并没有开始工作,这是就是NEW线程 状态;当我的导师在教我在这个工作中做思维导图的时候,就是RUNNABLE ,当我开始上手做的时候就是RUNNING ,当我被导师叫去办公室的时候,就是进入BLOCKED、WAITINGTIMED_WAITING 状态;当我将工作完成后就是TERMINATED状态。

二、使用代码来观察线程状态的转移和变化

1、观察NEW-RUNNABLE-TERMINATED变化

java 复制代码
class Demo{
lic class demo9 {
    public static void main(String[] args) {
        Thread t = new Thread(()->{
            for (int i = 0; i < 10; i++) {

            }
        },"南");
        System.out.println(t.getName()+t.getState());
        t.start();
        while (t.isAlive()){
            System.out.println(t.getName()+t.getState());
        }
        System.out.println(t.getName()+t.getState());
    }
}
//运算结果:
//南NEW
//南RUNNABLE
//南RUNNABLE
//南RUNNABLE
//南RUNNABLE
//南RUNNABLE
//南RUNNABLE
//南TERMINATED

2.观察WAITING、BLOCKED、TIMED_WAITING的变化

java 复制代码
class Demo {
 public static void main(String[] args) {
        Object locker = new Object();
        Thread t = new Thread(()->{

                synchronized (locker){
                    while (true) {
                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            throw new RuntimeException(e);
                        }
                    }
                }
        },"兴");
        t.start();
        Thread t2 = new Thread(()->{
           synchronized (locker){
               System.out.println("passion");
           }
        });
        t2.start();

    }
}

通过jconsole可以看到t1线程的状态事TIMED_WAITING,t2的状态事BLOCKED。

修改上⾯的代码, 把 t1 中的 sleep 换成 wait

java 复制代码
class Demo {
public static void main(String[] args) {
        Object locker = new Object();
        Thread t = new Thread(()->{
            synchronized (locker){
                while (true){
                    try {
                        locker.wait();
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }
                }
            }
        },"苏");
        t.start();
        while (true){
            System.out.println("passion");
        }
    }
}

通过jconsole可以看到t1的状态是WAITING。

结论:

  • BLOCKED表示等待取锁,WAITING和TIMED_WAITING表示等待其他线程发来通知。
  • TIMED_WAITING线程在等待唤醒,但设置了时间限制,WAITING线程就是在死等唤醒。

总结

今天我们学习了线程的几种状态,NEW--new了线程,但还没有开始运行;RUNNABLE--是线程在运行当中;BLOCKED--表示要等待锁被取走(开锁),才能被唤醒;WAITING--是死等;TIMED_WAITING是有时间限制的等待被唤醒。TERMINATED--线程已经完成了的状态。

今天的博客就到此结束了,谢谢各位佬的支持喜爱!!

下一节预告---线程安全问题(重点--面试高频考点)!!

相关推荐
撩得Android一次心动15 分钟前
Android LiveData 全面解析:使用Java构建响应式UI【源码篇】
android·java·android jetpack·livedata
组合缺一19 分钟前
Solon AI (Java) v3.9 正式发布:全能 Skill 爆发,Agent 协作更专业!仍然支持 java8!
java·人工智能·ai·llm·agent·solon·mcp
MSTcheng.23 分钟前
【C++】C++11新特性(二)
java·开发语言·c++·c++11
一 乐27 分钟前
校园二手交易|基于springboot + vue校园二手交易系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端
KIKIiiiiiiii28 分钟前
微信个人号API二次开发中的解决经验
java·人工智能·python·微信
80530单词突击赢29 分钟前
SpringBoot整合SpringMVC全解析
java·spring boot·后端
vx1_Biye_Design38 分钟前
基于Spring Boot+Vue的学生管理系统设计与实现-计算机毕业设计源码46223
java·vue.js·spring boot·spring·eclipse·tomcat·maven
vx_Biye_Design40 分钟前
基于Spring Boot+vue的湖北旅游景点门票预约平台的设计--毕设附源码29593
java·vue.js·spring boot·spring cloud·servlet·eclipse·课程设计
hay_lee1 小时前
Spring AI实现对话聊天-流式输出
java·人工智能·ollama·spring ai
Hx_Ma161 小时前
SpringBoot数据源自动管理
java·spring boot·spring