在kvm內部定義了線程狀態,如下:
enum {
THREAD_JUST_BORN = 1, /* 還沒有啓動*/
THREAD_ACTIVE = 2, /* 當前正在運行,或者在等待運行的隊列中*/
THREAD_SUSPENDED = 4, /* 等待monitor或者alarm */
THREAD_DEAD = 8, /* 線程退出 */
THREAD_MONITOR_WAIT = 16, // 等待鎖
THREAD_CONVAR_WAIT = 32, // 等待喚醒
THREAD_DBG_SUSPENDED = 64 // debug使用
} state; // 線程狀態定義
本文首先介紹THREAD_JUST_BORN. THREAD_JUST_BORN是在BuildThread方法中設置的:
newThread->state = THREAD_JUST_BORN;
而關於該方法在kvm啓動流程-006 中詳細介紹.
而BuildThread的調用點有兩處:
-
在InitializeThreading方法中調用,這點在kvm啓動流程-006 中有介紹.
-
在getVMthread中調用,其代碼如下:
THREAD getVMthread(JAVATHREAD_HANDLE javaThreadH) { /* Create the VM-level thread structure if necessary */ THREAD VMthread = unhand(javaThreadH)->VMthread; if (!VMthread) { VMthread = BuildThread(javaThreadH); } return VMthread; }
而關於 getVMthread方法的調用點有三處:
- Java_java_lang_Thread_start(也就是Thread.start()方法)
- Java_java_lang_Thread_setPriority0(也就是Thread.setPriority() 方法)
- Java_java_lang_Thread_interrupt0(也就是Thread.interrupt()方法)
那麼,哪個是首先調用 getVMthread方法的呢?
答案是 Java_java_lang_Thread_setPriority0,因爲該方法是在線程的方法中調用的.如下:
public Thread() {
init(null, "Thread-" + nextThreadNum());
}
private void init(Runnable target, String name) {
Thread parent = currentThread();
this.target = target;
this.name = name.toCharArray();
this.priority = parent.getPriority();
setPriority0(priority);
}
private native void setPriority0(int newPriority);
因此會在方法中最終調用Java_java_lang_Thread_setPriority0方法,其代碼如下:
void Java_java_lang_Thread_setPriority0(void)
{
int priority = popStack();
THREAD VMthread;
START_TEMPORARY_ROOTS
DECLARE_TEMPORARY_ROOT(JAVATHREAD, javaThread,
popStackAsType(JAVATHREAD)); // 獲得當前線程對象
// 設置優先級
javaThread->priority = (priority > MAX_PRIORITY ? MAX_PRIORITY :
(priority < MIN_PRIORITY ? MIN_PRIORITY : priority));
VMthread = getVMthread(&javaThread); // 獲得vm線程
VMthread->timeslice = javaThread->priority * TIMESLICEFACTOR; // 分配時間片
END_TEMPORARY_ROOTS
}
總結
THREAD_JUST_BORN 是線程新建的狀態。
關於後續狀態,後文介紹.