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 是线程新建的状态。

关于后续状态,后文介绍.

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值