• Java中线程的状态及切换


    线程的状态

    线程状态的分类

    线程作为操作系统调度的基本单位,在被调度时也会有很多种状态;
    线程一般分为以下几种:

    状态解释
    NEW安排了工作, 还未开始行动
    RUNNABLE可工作的. 又可以分成正在工作中和即将开始工作
    BLOCKED这几个都表示排队等着其他事情
    WAITING这几个都表示排队等着其他事情
    TIMED_WAITING这几个都表示排队等着其他事情
    TERMINATED工作完成了

    其中WAITING,TIMED_WAITING,TERMINATED都属于阻塞(表示PCB都处于阻塞队列中),这几个状态是不同原因的阻塞

    线程状态的转移

    在这里插入图片描述

    线程状态的打印

    打印线程的状态用getState方法:
    在这里插入图片描述
    打印线程这行代码在调用start方法之前,所以此时操作系统内核并未创建PCB,所以线程的状态是NEW。

    线程的切换

    NEW和TERMINATED

    NEW:表示创建了线程所需要执行的任务,但是还没有工作;
    TERMINATED:表示线程已经执行完任务,PCB释放了
    代码如下:

    public class Test4 {
        public static void main(String[] args) {
            Thread t = new Thread(() -> {
                System.out.println("hello");
            });
            System.out.println(t.getState());
            t.start();
            try {
                t.join();
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            System.out.println(t.getState());
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    在这里插入图片描述
    第一次输出NEW,因为此时只是创建了线程实例,指明了线程所要执行的任务,当线程执行完(打印hello)任务后,再次调用getState方法之后输出则是TERMINATED.

    RUNNABLE

    RUNNABLE:可工作的. 又可以分成正在工作中和即将开始工作,表示此时有线程正在CPU上执行或者等待执行

    public class Test4 {
        public static void main(String[] args) {
            Thread t = new Thread(() -> {
                for (int i = 0; i < 1000000; i++) {
    
                }
            });
            System.out.println(t.getState());
            t.start();
            System.out.println(t.getState());
            try {
                t.join();
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            System.out.println(t.getState());
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    在这里插入图片描述
    因为线程执行的任务是1000000不做任何操作,此时获取到线程的状态就是RUNNABLE.

    TIMED_WAITING

    TIMED_WAITING:表示这几个都表示排队等着其他事情,一般是因为线程在执行的时候进行了sleep操作;

    public class Test3 {
        public static void main(String[] args) {
            Thread t = new Thread(() -> {
                for (int i = 0; i < 10; i++) {
                    try {
                        Thread.sleep(10);
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }
                }
            });
            System.out.println(t.getState());
            t.start();
    
            for (int i = 0; i < 100; i++) {
                System.out.println(t.getState());
            }
    
            try {
                t.join();
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            System.out.println(t.getState());
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    在这里插入图片描述
    此时在输出NEW和TERMINATED之间分别输出了很多的RUNNABLE和TIMED_WAITING,因为当创建的线程在执行操作到sleep时,此时线程的状态就是TIMED_WAITING,当休眠结束线程继续执行时,此时线程的状态就是RUNNABLE.

  • 相关阅读:
    MyBatis的使用(XML映射文件)
    程序员的这些冷笑话,有点意思!
    Mybatis中limit用法补充
    聚观早报 | 长二丁成功发射北京三号B星;​字节推出“悟空搜索”
    scrapy实现分布式爬虫,scrapy-redis所遇到的问题,终端进入虚拟环境
    【LeetCode Cookbook(C++ 描述)】一刷二叉树之递归遍历(DFS)(下)
    MYSQL常用命令
    C++ 小游戏 视频及资料集(六)
    报名即将结束!11 大云原生领域开源技术干货一场拿下
    使用Docker安装ElasticSearch和可视化界面Kibana【图文教学】
  • 原文地址:https://blog.csdn.net/qq_47908816/article/details/128066226