zoukankan      html  css  js  c++  java
  • 线程的五种状态

    1.线程的五种状态

    线程的状态在 JDK 1.5 之后以枚举的方式被定义在 Thread 的源码中,它总共包含以下 6
    个状态:

    • NEW,新建状态,线程被创建出来,但尚未启动时的线程状态;

    -** RUNNABLE**,就绪状态,表示可以运行的线程状态,它可能正在运行,或者是在排队等待操作系统给它分配
    CPU 资源;

    • BLOCKED,阻塞等待锁的线程状态,表示处于阻塞状态的线程正在等待监视器锁,比如等待执行
      synchronized 代码块或者使用 synchronized 标记的方法;

    • WAITING,等待状态,一个处于等待状态的线程正在等待另一个线程执行某个特定的动作,比如,一个线程调用了
      Object.wait() 方法,那它就在等待另一个线程调用 Object.notify() 或
      Object.notifyAll() 方法;

    • TIMED_WAITING,计时等待状态,和等待状态(WAITING)类似,它只是多了超时时间,比如调用了有超时时间设置的方法
      Object.wait(long timeout) 和 Thread.join(long timeout)
      等这些方法时,它才会进入此状态;

    • TERMINATED,终止状态,表示线程已经执行完成。

    线程状态的源代码如下:

    public enum State {
        /**
         * 新建状态,线程被创建出来,但尚未启动时的线程状态
         */
        NEW,
    
        /**
         * 就绪状态,表示可以运行的线程状态,但它在排队等待来自操作系统的 CPU 资源
         */
        RUNNABLE,
    
        /**
         * 阻塞等待锁的线程状态,表示正在处于阻塞状态的线程
         * 正在等待监视器锁,比如等待执行 synchronized 代码块或者
         * 使用 synchronized 标记的方法
         */
        BLOCKED,
    
        /**
         * 等待状态,一个处于等待状态的线程正在等待另一个线程执行某个特定的动作。
         * 例如,一个线程调用了 Object.wait() 它在等待另一个线程调用
         * Object.notify() 或 Object.notifyAll()
         */
        WAITING,
    
        /**
         * 计时等待状态,和等待状态 (WAITING) 类似,只是多了超时时间,比如
         * 调用了有超时时间设置的方法 Object.wait(long timeout) 和 
         * Thread.join(long timeout) 就会进入此状态
         */
        TIMED_WAITING,
    
        /**
         * 终止状态,表示线程已经执行完成
         */
    }
    
    

    线程的工作模式是,首先先要创建线程并指定线程需要执行的业务方法,然后再调用线程的
    start() 方法,此时线程就从 NEW(新建)状态变成了
    RUNNABLE(就绪)状态,此时线程会判断要执行的方法中有没有 synchronized
    同步代码块,如果有并且其他线程也在使用此锁,那么线程就会变为
    BLOCKED(阻塞等待)状态,当其他线程使用完此锁之后,线程会继续执行剩余的方法。

    当遇到 Object.wait()Thread.join() 方法时,线程会变为
    WAITING(等待状态)状态,如果是带了超时时间的等待方法,那么线程会进入
    TIMED_WAITING(计时等待)状态,当有其他线程执行了 notify()notifyAll()
    方法之后,线程被唤醒继续执行剩余的业务方法,直到方法执行完成为止,此时整个线程的流程就执行完了,执行流程如下图所示:
    image

  • 相关阅读:
    react的50个面试题
    什么是宏队列跟微队列
    宏队列与微队列
    数组都有哪些方法
    vuex 跟 vue属性
    高阶组件
    如何创建视图簇(View cluster)-SE54/SM34
    ◆◆0如何从维护视图(Maintenace view)中取数据-[VIEW_GET_DATA]
    ◆◆0如何在SM30维护表时自动写入表字段的默认值-事件(EVENT)
    ◆◆0SAP Query 操作教程
  • 原文地址:https://www.cnblogs.com/xiaodou00/p/13499417.html
Copyright © 2011-2022 走看看