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

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

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

相关推荐
一定要AK7 分钟前
Spring 入门核心笔记
java·笔记·spring
A__tao8 分钟前
Elasticsearch Mapping 一键生成 Java 实体类(支持嵌套 + 自动过滤注释)
java·python·elasticsearch
KevinCyao21 分钟前
java视频短信接口怎么调用?SpringBoot集成视频短信及回调处理Demo
java·spring boot·音视频
迷藏49428 分钟前
**发散创新:基于Rust实现的开源合规权限管理框架设计与实践**在现代软件架构中,**权限控制(RBAC)** 已成为保障
java·开发语言·python·rust·开源
wuxinyan1231 小时前
Java面试题47:一文深入了解Nginx
java·nginx·面试题
新知图书2 小时前
搭建Spring Boot开发环境
java·spring boot·后端
冰河团队2 小时前
一个拉胯的分库分表方案有多绝望?整个部门都在救火!
java·高并发·分布式数据库·分库分表·高性能
洛_尘2 小时前
Java EE进阶:Linux的基本使用
java·java-ee
宸津-代码粉碎机2 小时前
Spring Boot 4.0虚拟线程实战调优技巧,最大化发挥并发优势
java·人工智能·spring boot·后端·python
MaCa .BaKa2 小时前
47-心里健康咨询平台/心理咨询系统
java·spring boot·mysql·tomcat·maven·intellij-idea·个人开发