kvm線程-005-線程狀態-THREAD_JUST_BORN

在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的調用點有兩處:

  1. 在InitializeThreading方法中調用,這點在kvm啓動流程-006 中有介紹.

  2. 在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方法的調用點有三處:

  1. Java_java_lang_Thread_start(也就是Thread.start()方法)
  2. Java_java_lang_Thread_setPriority0(也就是Thread.setPriority() 方法)
  3. 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 是線程新建的狀態。

關於後續狀態,後文介紹.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章