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--线程已经完成了的状态。

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

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

相关推荐
毅炼10 小时前
Netty 常见问题总结
java·网络·数据结构·算法·哈希算法
Anastasiozzzz10 小时前
leetcodehot100--最小栈 MinStack
java·javascript·算法
Sylvia-girl11 小时前
线程的死锁【了解】
java·开发语言·jvm
Elias不吃糖11 小时前
java开发的三层架构
java·开发语言·架构
pp起床11 小时前
【苍穹外卖】Day2.5 分类管理
java
lixin55655611 小时前
基于神经网络的音乐生成增强器
java·人工智能·pytorch·python·深度学习·语言模型
宫瑾11 小时前
【C语言】嵌入式C加强学习
java·c语言·学习
结衣结衣.11 小时前
protobuf介绍与快速上手
java·服务器·html
时艰.12 小时前
JVM — Java 类加载机制
java·开发语言·jvm
哪里不会点哪里.12 小时前
Spring MVC 核心原理解析:从请求到响应到底发生了什么?
java·spring·mvc