线程的状态 野性酷女 2024-02-17 13:13 8阅读 0赞 ## 观察线程的状态 ## **线程的状态是一个枚举类型Thread.State**,利用下面的代码可以获得所有的状态: public class ThreadState{ public static void main(String[] args) { for(Thread.State state : Thread.State.values()) { System.out.println(state); } } } 我们可以获得到以下的状态: > **NEW:安排了工作,还未开始行动(指Thread对象创建好了,但未调用start方法在系统中创建线程)** > > **RUNNABLE:可工作的,又可以分成正在工作中和即将开始工作.(也就是就绪状态:表示这个线程正在cpu上执行,或者准备就绪去cpu上执行)** > > **BLOCKED:表示排队等着其他事情(由于锁竞争,引起的阻塞)** > > **WAITING:表示排队等着其它事情(死等:比如join和wait)** > > **TIMED\_WAITING:表示排队等着其他事情(指定时间的阻塞,到了一定时间后解除阻塞,使用sleep会进入该状态,超时间的join也会)** > > **TERMINTED:工作完成了(Thread对象仍然存在,但是系统内部中的线程已经执行完毕(已经销毁了))** ## 线程状态和状态转移的意义 ## 下面是线程状态转移概览: ![616da7e203ef4f079e83cdf3bbeaa7b5.png][] > **状态的最大作用就是调试多线程代码bug时,给我们作为重要的参考依据**. > > 比如"程序卡住了"就意味着一些关键的线程阻塞了.就可以观察线程的状态(可以利用jconsole),就能分析出一些原因. ## 观察线程的状态和转移 ## (1)关注NEW,RUNNABLE,TERMINATED状态的转换 public class ThreadStateTransfer { public static void main(String[] args) { Thread t = new Thread(() -> { for(int i = 0; i < 1000_0000; i++) { } }, "李四"); //这里是还未行动,但安排了工作--NEW System.out.println(t.getName() + ": " + t.getState()); t.start(); //如果线程是存活的(工作中或即将开始工作)--RUNNABLE while(t.isAlive()) { System.out.println(t.getName() + ": " + t.getState()); } //工作完成了--TERMINATED System.out.println(t.getName() + ": " + t.getState()); } } (2)关注WAITING,BLOCKED,TIMED\_WAITING状态的转换. public class ThreadStateTransfer2 { public static final Object object = new Object(); public static void main(String[] args) { Thread t1 = new Thread(() -> { synchronized(object) { while(true) { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }, "t1"); t1.start(); Thread t2 = new Thread(() -> { synchronized(object) { System.out.println("hehe"); } }, "t2"); t2.start(); } } 使用jconsole可以看到t1的状态是TIMED\_WAITING,t2的状态是BLOCKED. ![4cd739c99e454067883601b0c811cf65.png][] ![e9474bb3b8f64bf0825c33d49f4d0178.png][] 修改上面的代码,将t1中的sleep换成wait: public class ThreadStateTransfer3 { public static final Object object = new Object(); public static void main(String[] args) { Thread t1 = new Thread(() -> { synchronized(object) { try { object.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } }, "t1"); ... } } ![6d6479a050e7499cabea5d0b63107025.png][] 可观察到t1的状态转换成了WAITING. > **结论:BLOCKED表示等待获取锁,WAITING和TIME\_WAITING表示等待其他线程发来通知.** > > **TIMED\_WAITING线程在等待唤醒,但设置了时限;WAITING线程在无限等待唤醒**. [616da7e203ef4f079e83cdf3bbeaa7b5.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/02/06/e1182387e0a44a96b2a5a745692a943c.png [4cd739c99e454067883601b0c811cf65.png]: https://img-blog.csdnimg.cn/direct/4cd739c99e454067883601b0c811cf65.png [e9474bb3b8f64bf0825c33d49f4d0178.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/02/06/f4ede32297ee423fbcb63dd7f433f746.png [6d6479a050e7499cabea5d0b63107025.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/02/06/69abd2ffb1194c8cbd6ad1fadd2303ad.png
相关 线程的状态 在Java中线程共分为6中状态: 1. NEW:创建好一个Java的Thread对象,并安排好了任务,没有调用start()方法,和PCB没有关系 1. RUNNABL 缺乏、安全感/ 2024年03月30日 14:38/ 0 赞/ 72 阅读
相关 线程状态和线程池状态 线程状态 有六种状态; 新创建(NEW) 可运行(Runnable) 锁阻塞(Blocked) 无线等待(Waiting) 计时等待(Timed Wa 桃扇骨/ 2023年10月06日 14:08/ 0 赞/ 41 阅读
相关 线程的状态 ![在这里插入图片描述][2d280b0176ba4be2ae9f37daba7f7c5d.gif_pic_center] 文章目录 一、线程的所有状态 二 ﹏ヽ暗。殇╰゛Y/ 2023年09月27日 13:09/ 0 赞/ 125 阅读
相关 线程的状态 我百度了一下,有说三种,有说四种,有说五种,有说六种,还有说七种。下边列出六种的说法,六种见的比较多。 这是线程的六种状态 1. 初始(NEW):新创建了一个线程对象, 墨蓝/ 2023年06月07日 05:37/ 0 赞/ 22 阅读
相关 线程的状态 线程的状态 在正式学习Thread类中的具体方法之前,我们先来了解一下线程有哪些状态,这个将会有助于后面对Thread类中的方法的理解。 线程从创建到最终的消亡,要 Dear 丶/ 2022年09月24日 14:22/ 0 赞/ 194 阅读
相关 线程的状态 要想实现多线程,必须在主线程中创建新的线程对象。任何线程一般具有5种状态, 即 创建、就绪、运行、阻塞、终止。线程状态的转移与方法之间的关系如图所示 ![这里写图片描述][ 心已赠人/ 2022年07月21日 02:49/ 0 赞/ 225 阅读
相关 线程的状态 线程对象在不同的运行时期有不同的状态,状态信息就存在于State枚举类中, \ public static enum Thread.State extends En 秒速五厘米/ 2022年06月08日 00:46/ 0 赞/ 221 阅读
相关 线程的状态 Thread源码里定义了6种状态,如下: \ A thread state. A thread can be in one of the follo 川长思鸟来/ 2022年02月15日 13:47/ 0 赞/ 268 阅读
相关 线程的状态 线程共有六种状态 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9 妖狐艹你老母/ 2021年12月19日 00:21/ 0 赞/ 376 阅读
相关 线程的状态 RUNNABLE这个名字很具有欺骗性,很容易让人误以为处于这个状态的线程正在运行。事实上,这个状态只是表示,线程是可运行的。我们已经无数次提到过,一个单核CPU在同一时刻... 朱雀/ 2020年05月12日 15:57/ 0 赞/ 907 阅读
还没有评论,来说两句吧...