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

有目标就不怕路远。年轻人.无论你现在身在何方.重要的是你将要向何处去。只有明确的目标才能助你成功。没有目标的航船.任何方向的风对他来说都是逆风。因此,再遥远的旅程,只要有目标.就不怕路远。没有目标,哪来的劲头?一车尔尼雷夫斯基

导读:本篇文章讲解 线程的状态转换以及用代码证明(看此一篇即可,带图,带代码验证),希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

背景

带你了解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状态?
详细读图中的文字
在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之家整理,本文链接:https://www.bmabk.com/index.php/post/135128.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之家——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!