线程的状态转换以及用代码证明(看此一篇即可,带图,带代码验证)

背景

带你了解Java中的线程状态,有图,有代码展示,全是干货。

概述

你看Thread类里的State枚举,就是Java线程的状态了。
网上的状态非常多,你看这个枚举比较权威,各种名词,什么可运行状态,就绪状态,乱七八糟的,记英文即可

  • new:刚 new 出来的线程还未 start() 就是 new 状态
  • terminated:线程将代码运行完毕了就是 terminated 状态
  • timed_waiting:timed是 “带有时间的” 的意思。带有时间的等待,比如常用的sleep(millis)
  • waiting:不带时间的等待,比如 join()、wait() 都是
  • blocked:这个比如需要锁,拿不到,就进入了blocked状态。比如synchronized块获取不到锁而被阻塞了

关于runnable状态,其实是最让人迷惑的
一般人都会有疑惑 “runnable好像描述得不准确,runnable从英文单词来看表示可运行,感觉runnable更加贴近于常说的ready(可运行)状态,另外难道没有运行中的状态吗?”

Thread$State里的runnable,其实是包含两种状态的,一种是还未被CPU挑选中的所谓的可运行状态(ready),另一种是已经被CPU挑中的正在运行的状态(running)。

PS:其实有一种观点,认为Thread$State里的runnable有3种状态:可运行、正在运行,以及阻塞状态。这里的 “阻塞状态” 是操作系统层面的阻塞,并不是枚举里的blocked状态。操作系统里的 “阻塞状态” 也归类为runnable。

操作系统的阻塞状态指的是什么呢? 指的,比如读取文件的时候的阻塞状态

状态转换和线程API的对应图

在这里插入图片描述

代码获取线程里的各种状态

/**
 * 用一个类来演示线程的各种状态 Thread$State (API层面的线程的状态可以从这个枚举中查看)
 */
public class T05_ThreadState {
    public static void main(String[] args) {
        // new
        Thread t1 = new Thread(() -> {
        }, "t1");

        // runnable
        Thread t2 = new Thread(() -> {
            while (true) {

            }
        }, "t2");
        t2.start();

        // timed_waiting
        Thread t3 = new Thread(() -> {
            try {
                Thread.sleep(100*1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }, "t3");
        t3.start();

        // waiting
        Thread t4 = new Thread(() -> {
            try {
                t2.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }, "t4");
        t4.start();


        // blocked
        Thread keepLock = new Thread(() -> {
            synchronized (T05_ThreadState.class) {
                while (true) {

                }
            }
        }, "keepLock");
        keepLock.start();

        // 主线程先睡一下,让keepLock先获得锁
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        Thread t5 = new Thread(() -> {
            synchronized (T05_ThreadState.class) {

            }
        }, "t5");
        t5.start();

        // terminated
        Thread t6 = new Thread(() -> {
            System.out.println("end");
        }, "t6");
        t6.start();

        // 睡一下,让 t6 运行完毕以便得到terminated状态
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }


        System.out.println(t1.getState());// new
        System.out.println(t2.getState());// runnable
        System.out.println(t3.getState());// timed_waiting
        System.out.println(t4.getState());// waiting
        System.out.println(t5.getState());// blocked
        System.out.println(t6.getState());// terminated
    }
}

IDEA 里看到的线程为什么是RUNNING状态?

为什么不是runnable状态?
详细读图中的文字
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值