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; // 线程状态定义
1
2
3
4
5
6
7
8
9
本文首先介绍THREAD_JUST_BORN. THREAD_JUST_BORN是在BuildThread方法中设置的:

newThread->state = THREAD_JUST_BORN;
1
而关于该方法在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;
}
1
2
3
4
5
6
7
8
9
而关于 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);
1
2
3
4
5
6
7
8
9
10
11
12
13
因此会在方法中最终调用Java_java_lang_Thread_setPriority0方法,其代码如下:

void Java_java_lang_Thread_setPriority0(void)
{
int priority = popStack();
THREAD VMthread;


START_TEMPORARY_ROOTS(http://www.amjmh.com)
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
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
总结
THREAD_JUST_BORN 是线程新建的状态。

关于后续状态,后文介绍

posted @ 2019-09-12 17:23  水至清明  阅读(138)  评论(0编辑  收藏  举报