【图文详解】Java打印线程的六种状态

tech2023-11-22  79

目录

问题描述问题分析思路图示代码结果后感

问题描述

写一个Java程序,打印出线程的六种状态:NEW、RUNNABLE、TIMED_WAITING、BLOCKED、WAITING、TERMINATED。

问题分析

众所周知,Java线程的六种状态是定义在Thread类中的一个枚举类中,OK了,这还不简单?

//Main.java public class Main { public static void main(String[] args) { for (Thread.State state: Thread.State.values()) { System.out.println(state); } } }

下面是输出:

NEW RUNNABLE BLOCKED WAITING TIMED_WAITING TERMINATED

哈哈哈,开玩笑的,题目肯定不是让你遍历枚举类的值。 我们知道,new一个Thread之后,线程的状态就是NEW,把线程运行起来,线程的状态就是RUNNABLE,线程sleep的时候状态是TIMED_WAITING,线程的同步监视器执行wait方法后线程进入WAITING,线程等待同步监视器的时候状态是BLOCKED,线程运行结束就是TERMINATED。 为了把这些状态都输出,除了main方法的主线程外,我创建了两个线程,大致思路如下图所示。 NEW和RUNNABLE这两个状态就不解释了。

思路图示

这张图片是我自己画的。图上其实已经很清楚了,这里面有两个点需要注意:

为了让线程二等待锁,线程一一定要先拿到锁。主线程输出要设置好sleep时间,要在对的时间输出。

代码

网上有的代码也是输出线程的六种状态,代码写的很混乱,最后结果还是错的,这段代码就是上面这张图的实现,我跑了n多次,都能得到正确的结果。

//Main.java public class Main { public static void main(String[] args) { Object object = new Object(); Thread t1 = new Thread(new Runnable() { @Override public void run() { synchronized (object) { //线程一在这里sleep是为了: //1.让主线程输出线程一或者线程二的TIMED_WAITING状态 //2.让线程二保持BLOCKED状态,让主线程输出 try { Thread.sleep(1500); } catch (InterruptedException e) { e.printStackTrace(); } try { //执行wait方法后,线程一进入WAITING状态,并且释放锁 object.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } }); Thread t2 = new Thread(new Runnable() { @Override public void run() { //线程二在这里sleep就是为了保证线程一先拿到锁 try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (object) { //线程二在这里sleep就是为了线程一保持WAITING的状态,让主线程输出 try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } //线程二唤醒线程一,两个线程都执行完 object.notifyAll(); } } }); System.out.println(t1.getState()); t1.start(); t2.start(); System.out.println(t1.getState()); try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(t2.getState()); try { Thread.sleep(750); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(t2.getState()); try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(t1.getState()); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(t1.getState()); } }

结果

NEW RUNNABLE TIMED_WAITING BLOCKED WAITING TERMINATED

后感

上真的好多文章质量太差,粘贴的很多内容都是错的,作者完全不负责。我能保证我的代码都是自己写过的,跑过的,你复制下来自己跑能跑通,能得到和我一样的结果。我会认真把博客写好。

最新回复(0)