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!!!
原文地址:https://www.cnblogs.com/JunkingBoy/p/14860593.html