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!!!
  • 相关阅读:
    闽江学院2015-2016学年下学期《软件测试》课程-第五次博客作业
    在Swift中应用Grand Central Dispatch(下)
    在Swift中应用Grand Central Dispatch(上)转载自的goldenfiredo001的博客
    Asp.net mvc 框架揭秘之Asp.net +Mvc简介
    JavaScript数组
    网页校验
    删除弹出提示框_MVC
    业务体会
    判断数组值是否有重复
    sql
  • 原文地址:https://www.cnblogs.com/JunkingBoy/p/14860593.html
Copyright © 2011-2022 走看看