zoukankan      html  css  js  c++  java
  • 6.7Java深度观察状态

    6.7Java深度观察状态

    线程的五大状态

    新生状态

    new一个实现类对象(实现多线程接口)--->一旦创建就会有工作空间,工作空间与主存进行交互

    就绪状态
    • 调用star方法进入

    • 阻塞事件接触以后回到就绪状态而不是直接进入运行状态

    • 运行中让出cpu的资源yield直接进入继续--->yield方法线程不进入阻塞

    • jvm从本地线程切换其他线程

    运行状态

    running我们无法控制,由cpu去控制。所以就绪状态和运行状态统称runnable

    阻塞状态
    • sleep

      • sleep的细分本质是--->timewait

    • join

    • wait--->线程状态内部对阻塞进行区分

      • wait的细分本质是--->broke

    • read、write

    死亡状态

    terminated

    Thread.state类--->该类是个枚举类(Enum)

    该类下对线程的状态做了细分:

    • NEW--->创建一个线程对象

    • RUNNABLE--->调用start方法或者运行中

    • BLOCKED--->遇到阻塞(IO操作、JUC当中的锁定)

    • WAITING--->(sleep、join这样的成为waiting)

    • TIMED_WAITING--->(给了时间)

    • TERMINATED

    线程状态的细分

    • 新生状态

    • 就绪和运行状态

      • 就绪和运行

    • 阻塞状态

      • 锁定--->BLOCKED

      • 等待--->waiting

      • 有时间的等待--->time_waiting

    • 结束、死亡状态

    通过Thread类当中的getState方法查看线程状态,并通过Thread.State.TERMINATED方法结束查看
    package iostudy.threadstate;

    import javax.swing.plaf.nimbus.State;

    /**
    * 观察线程状态类--->Thread.state类里面由具体的状态分类
    * 要时刻注意sleep、join和yield的区别
    * @since JDK 1.8
    * @date 2021/6/7
    * @author Lucifer
    */
    public class AllState {

       /**
        * 新建线程对象
        * 观察线程状态
        * @param args
        */
       public static void main(String[] args) {
           Thread t = new Thread(() -> {
               for (int i = 0; i < 5; i++){
                   try {
                       /*线程等待*/
                       Thread.sleep(100); //Time_Waiting阻塞
                  }catch (InterruptedException e){
                       System.out.println(e.getMessage());
                       e.printStackTrace();
                  }

                   System.out.println("Lucifer!!!");

              }
          });

           /*调用getState方法观察状态--->Thread类下的方法*/
           Thread.State state = t.getState();
           /*打印具体的状态*/
           System.out.println(state); //在这里打印的线程处于新生状态--->NEW状态

           /*让线程变成就绪状态*/
           t.start();
           state = t.getState(); //Runnable状态
           System.out.println(state);

           /*让线程进入阻塞状态--->听过死循环监视*/
           /*调用自身方法让线程停止*/
           while (state != Thread.State.TERMINATED){
               /*500毫秒监控一次*/
               try {
                   /*线程等待时间*/
                   Thread.sleep(500);
              }catch (InterruptedException e){
                   System.out.println(e.getMessage());
                   e.printStackTrace();
              }

               state = t.getState(); //Time_Waiting状态

               System.out.println(state);

          }

           /*查看最后一次的线程状态*/
           state = t.getState();
           System.out.println(state);

      }
    }
    因为最终活动的线程数仅存一个主线程,所以可以通过活动的线程数量来判断停止
    package iostudy.threadstate;

    import javax.swing.plaf.nimbus.State;

    /**
    * 观察线程状态类--->Thread.state类里面由具体的状态分类
    * 要时刻注意sleep、join和yield的区别
    * @since JDK 1.8
    * @date 2021/6/7
    * @author Lucifer
    */
    public class AllState {

       /**
        * 新建线程对象
        * 观察线程状态
        * @param args
        */
       public static void main(String[] args) {
           Thread t = new Thread(() -> {
               for (int i = 0; i < 5; i++){
                   try {
                       /*线程等待*/
                       Thread.sleep(100); //Time_Waiting阻塞
                  }catch (InterruptedException e){
                       System.out.println(e.getMessage());
                       e.printStackTrace();
                  }

                   System.out.println("Lucifer!!!");

              }
          });

           /*调用getState方法观察状态--->Thread类下的方法*/
           Thread.State state = t.getState();
           /*打印具体的状态*/
           System.out.println(state); //在这里打印的线程处于新生状态--->NEW状态

           /*让线程变成就绪状态*/
           t.start();
           state = t.getState(); //Runnable状态
           System.out.println(state);

           /*
           因为线程中有活动的线程数
           可以通过线程数来控制结束
           因为最终的线程数会由很多变成一个主线程,所以可以通过这个线程数量来控制
           */
           while (true){

               /*调用Thread类里面一个记录线程数的方法*/
               //活动的线程数
               int num = Thread.activeCount();
               if (num == 1){
                   break;
              }

               /*500毫秒监控一次*/
               try {
                   /*线程等待时间*/
                   Thread.sleep(500);
              }catch (InterruptedException e){
                   System.out.println(e.getMessage());
                   e.printStackTrace();
              }

               state = t.getState(); //Time_Waiting状态

               System.out.println(state);

          }
      }
    }
    重点观察的线程状态

    根据Thread.state类里面的对线程状态的划分:

    • new

    • runnable

    • running

    • blocked

      • waiting

      • time_waiting

      • block

    • terminated

    重点关注阻塞以及结束--->sleep、join、yield和自己编写的方法停止线程

    死亡之后的线程不能再切回新生状态--->无法新生

    It's a lonely road!!!
  • 相关阅读:
    Atitit sql计划任务与查询优化器统计信息模块
    Atitit  数据库的事件机制触发器与定时任务attilax总结
    Atitit 图像处理知识点体系知识图谱 路线图attilax总结 v4 qcb.xlsx
    Atitit 图像处理 深刻理解梯度原理计算.v1 qc8
    Atiti 数据库系统原理 与数据库方面的书籍 attilax总结 v3 .docx
    Atitit Mysql查询优化器 存取类型 范围存取类型 索引存取类型 AND or的分析
    Atitit View事件分发机制
    Atitit 基于sql编程语言的oo面向对象大规模应用解决方案attilax总结
    Atitti 存储引擎支持的国内点与特性attilax总结
    Atitit 深入理解软件的本质 attilax总结 软件三原则"三次原则"是DRY原则和YAGNI原则的折
  • 原文地址:https://www.cnblogs.com/JunkingBoy/p/14860593.html
Copyright © 2011-2022 走看看