zoukankan      html  css  js  c++  java
  • 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 是线程新建的状态。

    关于后续状态,后文介绍

  • 相关阅读:
    matplotlib讲义
    车间调度问题(part3: 遗传算法)
    sympy库和matplotlib库简介
    python列表
    第十周周三练习
    第十一周周一练习题
    MyEcplise中关于部署文件不成功的问题
    Java中的get()和set()方法
    Java中this关键字的使用
    信号完整性问题的几个基本原则
  • 原文地址:https://www.cnblogs.com/hyhy904/p/11513043.html
Copyright © 2011-2022 走看看