美文网首页thread相关
Thread相关学习之四 - ThreadStatus

Thread相关学习之四 - ThreadStatus

作者: AlanKim | 来源:发表于2019-02-18 06:41 被阅读21次
    javaClasses.hpp中对ThreadStatus的定义

    不过在jvm中,javaClasses.hpp中有一个枚举定义,如下:

    // Java Thread Status for JVMTI and M&M use.
    // This thread status info is saved in threadStatus field of
    // java.lang.Thread java class.  
    enum ThreadStatus {
        NEW                      = 0,
        RUNNABLE                 = JVMTI_THREAD_STATE_ALIVE +          // runnable / running
                                   JVMTI_THREAD_STATE_RUNNABLE,
        SLEEPING                 = JVMTI_THREAD_STATE_ALIVE +          // Thread.sleep()
                                   JVMTI_THREAD_STATE_WAITING +
                                   JVMTI_THREAD_STATE_WAITING_WITH_TIMEOUT +
                                   JVMTI_THREAD_STATE_SLEEPING,
        IN_OBJECT_WAIT           = JVMTI_THREAD_STATE_ALIVE +          // Object.wait()
                                   JVMTI_THREAD_STATE_WAITING +
                                   JVMTI_THREAD_STATE_WAITING_INDEFINITELY +
                                   JVMTI_THREAD_STATE_IN_OBJECT_WAIT,
        IN_OBJECT_WAIT_TIMED     = JVMTI_THREAD_STATE_ALIVE +          // Object.wait(long)
                                   JVMTI_THREAD_STATE_WAITING +
                                   JVMTI_THREAD_STATE_WAITING_WITH_TIMEOUT +
                                   JVMTI_THREAD_STATE_IN_OBJECT_WAIT,
        PARKED                   = JVMTI_THREAD_STATE_ALIVE +          // LockSupport.park()
                                   JVMTI_THREAD_STATE_WAITING +
                                   JVMTI_THREAD_STATE_WAITING_INDEFINITELY +
                                   JVMTI_THREAD_STATE_PARKED,
        PARKED_TIMED             = JVMTI_THREAD_STATE_ALIVE +          // LockSupport.park(long)
                                   JVMTI_THREAD_STATE_WAITING +
                                   JVMTI_THREAD_STATE_WAITING_WITH_TIMEOUT +
                                   JVMTI_THREAD_STATE_PARKED,
        BLOCKED_ON_MONITOR_ENTER = JVMTI_THREAD_STATE_ALIVE +          // (re-)entering a synchronization block
                                   JVMTI_THREAD_STATE_BLOCKED_ON_MONITOR_ENTER,
        TERMINATED               = JVMTI_THREAD_STATE_TERMINATED
      };
    

    可以看到,在jvm中定义了更多的线程状态。注意看其中以JVMTI_开头的数据,就是上面在jvmti.xml中定义的常量。可以看到,比JavaThreadState多了3种状态:SLEEPING、PARKED、TIME_PARKED。为什么呢?

    JVM中线程状态的分类

    依然看jvmti.xml(用firefox打开),可以看到如下内容:

    Get Thread State

    jvmtiError
    GetThreadState(jvmtiEnv* env,
                jthread thread,
                jint* thread_state_ptr)
    

    ​ Get the state of a thread. The state of the thread is represented by the answers to the hierarchical set of questions below:

    • Alive?
      • Not alive.
        • Why not alive?
          • New.
          • Terminated ([JVMTI_THREAD_STATE_TERMINATED](file:///home/alanjin/gitspace/jdk10/hotspot/src/share/vm/prims/jvmti.xml#JVMTI_THREAD_STATE_TERMINATED))
      • Alive (JVMTI_THREAD_STATE_ALIVE)
        • Suspended?
          • Suspended ([JVMTI_THREAD_STATE_SUSPENDED](file:///home/alanjin/gitspace/jdk10/hotspot/src/share/vm/prims/jvmti.xml#JVMTI_THREAD_STATE_SUSPENDED))
          • Not suspended
        • Interrupted?
          • Interrupted ([JVMTI_THREAD_STATE_INTERRUPTED](file:///home/alanjin/gitspace/jdk10/hotspot/src/share/vm/prims/jvmti.xml#JVMTI_THREAD_STATE_INTERRUPTED))
          • Not interrupted.
        • In native?
          • In native code ([JVMTI_THREAD_STATE_IN_NATIVE](file:///home/alanjin/gitspace/jdk10/hotspot/src/share/vm/prims/jvmti.xml#JVMTI_THREAD_STATE_IN_NATIVE))
          • In Java programming language code
        • What alive state?
          • Runnable ([JVMTI_THREAD_STATE_RUNNABLE](file:///home/alanjin/gitspace/jdk10/hotspot/src/share/vm/prims/jvmti.xml#JVMTI_THREAD_STATE_RUNNABLE))
          • Blocked ([JVMTI_THREAD_STATE_BLOCKED_ON_MONITOR_ENTER](file:///home/alanjin/gitspace/jdk10/hotspot/src/share/vm/prims/jvmti.xml#JVMTI_THREAD_STATE_BLOCKED_ON_MONITOR_ENTER))
          • Waiting (JVMTI_THREAD_STATE_WAITING)
            • Timed wait?
              • Indefinite ([JVMTI_THREAD_STATE_WAITING_INDEFINITELY](file:///home/alanjin/gitspace/jdk10/hotspot/src/share/vm/prims/jvmti.xml#JVMTI_THREAD_STATE_WAITING_INDEFINITELY))
              • Timed ([JVMTI_THREAD_STATE_WAITING_WITH_TIMEOUT](file:///home/alanjin/gitspace/jdk10/hotspot/src/share/vm/prims/jvmti.xml#JVMTI_THREAD_STATE_WAITING_WITH_TIMEOUT))
            • Why waiting?
              • Object.wait ([JVMTI_THREAD_STATE_IN_OBJECT_WAIT](file:///home/alanjin/gitspace/jdk10/hotspot/src/share/vm/prims/jvmti.xml#JVMTI_THREAD_STATE_IN_OBJECT_WAIT))
              • LockSupport.park ([JVMTI_THREAD_STATE_PARKED](file:///home/alanjin/gitspace/jdk10/hotspot/src/share/vm/prims/jvmti.xml#JVMTI_THREAD_STATE_PARKED))
              • Sleeping ([JVMTI_THREAD_STATE_SLEEPING](file:///home/alanjin/gitspace/jdk10/hotspot/src/share/vm/prims/jvmti.xml#JVMTI_THREAD_STATE_SLEEPING))

    可以看到,在JVM中,对线程的状态会有各种分支分类。而把Sleeping\Parked其实是放在了WAITING范畴内.也就是说,Java Thread只是上层的一层包装,而作为底层的JVMThread,实现上层包装,则需要多个底层状态的组合。

    相关文章

      网友评论

        本文标题:Thread相关学习之四 - ThreadStatus

        本文链接:https://www.haomeiwen.com/subject/frnksqtx.html