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!!!
  • 相关阅读:
    面试题中关于String的常见操作
    base64 加密 解密 Java代码实现 【尝试 博客园 用Markdown 编写】
    md5 32位 加密原理 Java实现md5加密
    base64 加密原理 解密原理
    2018年 10月份开始执行的最新税率表 2019年1月 小孩住房贷款等怎么扣
    安装Zookeeper和kafka,安装完毕后,遇到的错误
    Jmeter自动化测试 数据驱动测试,将数据存入csv文件中来调用,或将数据存在DB中进行调用
    Jmeter 同一个测试计划下的多个线程组 执行顺序 希望调整为顺序执行
    Json多层嵌套,要怎么提取?
    总结下我遇到过的接口测试
  • 原文地址:https://www.cnblogs.com/JunkingBoy/p/14860593.html
Copyright © 2011-2022 走看看