• JavaEE——Java线程的几种状态


    JavaEE传送门

    JavaEE

    JavaEE——进程与线程的关系

    JavaEE——Thread类



    Java线程的几种状态

    1. 线程的所有状态

    • NEW: Thread对象创建出来了, 但是内核PCB还未创建, 还没有真正创建线程 (最初的状态)
    • TERMINATED: 内核PCB销毁了, 但是Thread对象还在 (最后的状态)
    • RUNNABLE: 就绪状态, 可分成正在工作中和即将开始工作 (正在CPU上运行 or 在就绪队列中排队)
    • TIMED_WAITING: 按照一定的时间, 进行阻塞 (sleep)
    • WAITING: 特殊的阻塞状态, 调用wait
    • BLOCKED: 等待锁的时候进入阻塞状态

    2. 画图理解线程状态


    3. 观察线程的状态

    #关注NEW, RUNNABLE, TERMINATED状态的转换

    public class Test {
        public static void main(String[] args) throws InterruptedException {
            Thread t = new Thread(() -> {
                for (int i = 0; i < 100000; i++) {
    
                }
            });
            //t 开始之前 NEW
            System.out.println(t.getState());
    
            t.start();
    
            //t 正在工作 RUNNABLE
            System.out.println(t.getState());
    
            t.join();
    
            //t 结束之后, TERMINATED
            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

    #关注WAITING, BLOCKED, TIMED_WAITING状态的转换

    • TIMED_WAITING, 我们修改一下线程中的代码
    public class Test {
        public static void main(String[] args) throws InterruptedException {
            Thread t = new Thread(() -> {
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            });
            t.start();
    
            Thread.sleep(50);
            //TIMED_WAITING
            System.out.println(t.getState());
    
            t.join();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    # 注意 #

    当前线程运行到sleep, 得到的状态是TIMED_WAITING. 如果还未运行sleep, 得到的状态则是RUNNABLE. 具体得到的是当前的哪个状态, 也是有一定的随机因素的, (毕竟程序在调度的时候具体执行顺序是不确定的)

    • BLOCKED
    public class Test {
        public static void main(String[] args) throws InterruptedException {
              final Object object = new Object();
              Thread t = new Thread(new Runnable() {
            	@Override
    	        public void run() {
    	            synchronized (object) {
    	                System.out.println("hello thread");
    	           }
    	       }
    	   }, "t");
        	t.start();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    使用 jconsole 可以看到 t 的状态是 BLOCKED

    • WAITING
    public class Test {
        public static void main(String[] args) throws InterruptedException {
              final Object object = new Object();
              Thread t = new Thread(new Runnable() {
            	@Override
    	        public void run() {
    	            synchronized (object) {
    	               try {
                        	object.wait();
    	               } catch (InterruptedException e) {
                        	e.printStackTrace();
                       }
    	           }
    	       }
    	   }, "t");
        	t.start();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    使用 jconsole 可以看到 t 的状态是 WAITING


    🌷(( ◞•̀д•́)◞⚔◟(•̀д•́◟ ))🌷

    以上就是今天要讲的内容了,希望对大家有所帮助,如果有问题欢迎评论指出,会积极改正!!
    在这里插入图片描述
    加粗样式

    这里是Gujiu吖!!感谢你看到这里🌬
    祝今天的你也
    开心满怀,笑容常在。
  • 相关阅读:
    Tars-Java网络编程源码分析
    激光雷达成「烫手山芋」?或成车企降本的牺牲品
    GPU学习(1)
    Pintia(拼题A)刷题插件 on VS Code
    AIPainter:创意绘画的智能助手
    git你学“废”了吗?——git本地仓库的创建
    ArrayList 和 Vector,LinkedList
    腾讯mini项目-【指标监控服务重构】2023-08-18
    大数据基础设施搭建 - JDK
    lightdb-归档日志清理优化(22.4)
  • 原文地址:https://blog.csdn.net/m0_58592142/article/details/126850498