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

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

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

相关推荐
悟空码字1 小时前
SpringBoot 整合 RabbitMQ:和这只“兔子”交朋友
java·后端·rabbitmq
雨中飘荡的记忆2 小时前
Java并发工具深度剖析与实战
java
小股虫2 小时前
从零开始:ActiveMQ安装、Java应用实战与Web控制台体验
java·activemq·java-activemq
java_logo2 小时前
RUSTFS Docker 容器化部署指南
java·运维·docker·容器·jenkins·运维开发
uup2 小时前
秒杀系统中的超卖与重复下单问题
java
用户8307196840822 小时前
Spring注入原型Bean,为啥”新“对象“不翼而飞”?
java
初听于你2 小时前
Thymeleaf 模板引擎讲解
java·服务器·windows·spring boot·spring·eclipse
刘 大 望2 小时前
JVM(Java虚拟机)
java·开发语言·jvm·数据结构·后端·java-ee
超级种码2 小时前
JVM 字节码指令活用手册(基于 Java 17 SE 规范)
java·jvm·python