• 001 线程的状态


    一 . 概述

    线程的整个生命周期是在不断切换其状态的.

      在jdk中的Thread类之中有一个枚举类,在这个枚举类之中定义了线程的所有状态.


     二 .线程的状态 

    public enum State {
            
            NEW, // 线程创建之后的状态,此时的线程对象不具有可运行行
          
            RUNNABLE, // 线程调用start()方法之后具有的状态,此时线程是可以运行的,但是是否运行取决于时间片是否分配
          
            BLOCKED, // 阻塞状态,线程由于未获得锁对象而进入阻塞队列之中
         
            WAITING, // 线程由于调用了wait()等方法进行等待队列之中,需要等待信号才能重新进入可运行状态
          
            TIMED_WAITING, // 由于调用了sleep(),wait(时间)等方法进行等待队列,当等待一段时间可以进入的可运行状态
    
            TERMINATED; // 线程终结状态
        }

    上面的所有状态里面在加上一running状态总共有7个状态.

      [1]new状态: 当一个线程创建之后就处于new状态.

      [2]runnable状态: 就绪状态,该线程是可以在抢占了时间片之后就能运行.

      [3]Terminated状态 : 线程终结之后就处于死亡状态.

      [4]block状态: 线程因没有获得锁而被迫进入了锁池之中的状态,或者IO资源没有获取到,都是被迫进入的.

      [5]waiting状态 : 线程主动进入等待池中,等待其他线程唤醒自己.

      [6]time_waiting(sleep)状态: 线程主动进入睡眠状态.

      [7]running(运行)状态:获取时间片的线程的状态,处于正在运行的状态中.

    下面的图可以简单的描述上面线程状态的转换模型:


     三 .线程状态转换

      在上面线程的状态的描述其实无法很详细的,因为线程可能由于各种原因进行了状态的转换.

    我们现在了解线程的状态: 

        这里需要各种的API,但是现在仅仅只是作为一个了解.

      例子:

        @Test
        public void test() {
            //创建了一个线程,此时线程处于new状态
            Thread thread = new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        //此时线程处于运行状态
                        Thread.sleep(300); //此时线程处于睡眠状态
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    //
                    for(int i = 0 ; i <5 ;i++)
                        System.out.println("running ...");
                    
                    try {
                        //陷入到了常量的一个等待池,
                        //没有其他线程的唤醒,则该线程有缘都会等待该线程.
                        "1".wait(); 
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            });
            thread.start();
            //开启线程,线程就处于了runnable--就绪状态.
        }

    在上面的例子中,我们展现了多个线程的状态.

    但是现在还无法展现更多的状态的状态,当对线程的理解更深的情况下,我们就对这一部分的理解更好.

  • 相关阅读:
    Flask框架基础4
    Flask框架基础3
    Flask框架基础2
    Flask框架基础1
    项目上线流程-Django后端+vue前端
    Git操作
    DRF-jwt认证
    四种方式实现单例模式
    drf框架4-views视图家族操作
    drf框架3-ModelSerializer操作序列化与反序列化
  • 原文地址:https://www.cnblogs.com/trekxu/p/8974975.html
Copyright © 2020-2023  润新知