javaClasses.hpp中對(duì)ThreadStatus的定義
不過在jvm中,javaClasses.hpp中有一個(gè)枚舉定義守伸,如下:
// 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中定義了更多的線程狀態(tài)。注意看其中以JVMTI_開頭的數(shù)據(jù),就是上面在jvmti.xml中定義的常量顽馋。可以看到幌羞,比JavaThreadState多了3種狀態(tài):SLEEPING寸谜、PARKED、TIME_PARKED属桦。為什么呢熊痴?
JVM中線程狀態(tài)的分類
依然看jvmti.xml(用firefox打開),可以看到如下內(nèi)容:
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中果善,對(duì)線程的狀態(tài)會(huì)有各種分支分類。而把Sleeping\Parked其實(shí)是放在了WAITING范疇內(nèi).也就是說系谐,Java Thread只是上層的一層包裝巾陕,而作為底層的JVMThread,實(shí)現(xiàn)上層包裝纪他,則需要多個(gè)底層狀態(tài)的組合鄙煤。