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

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

kvm线程-005-线程状态-THREAD_JUST_BORN相关推荐

  1. linux kvm查看线程状态,kvm线程-005-线程状态-THREAD_JUST_BORN

    在kvm内部定义了线程状态,如下: enum { THREAD_JUST_BORN = 1, /* 还没有启动*/ THREAD_ACTIVE = 2, /* 当前正在运行,或者在等待运行的队列中*/ ...

  2. 面试:为什么 Java 线程没有Running状态?

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源 | my.oschina.net/goldenshaw/bl ...

  3. 为什么 Java 线程没有 Running 状态?一下被问懵!

    什么是 RUNNABLE? 与传统的ready状态的区别 与传统的running状态的区别 当I/O阻塞时 如何看待RUNNABLE状态? Java虚拟机层面所暴露给我们的状态,与操作系统底层的线程状 ...

  4. JAVA线程六种状态_Java:线程的六种状态及转化

    多线程概述及创建方式 Java:线程的六种状态及转化 关于线程的生命周期,网上书上说法不一,难以统一,本篇做一个总结: java.lang.Thread.State枚举类中定义了六种线程的状态,可以调 ...

  5. 线程五种状态(新建、就绪、运行、阻塞、死亡)

    线程的5种状态: 每个 Java 程序都有一个缺省的主线程,对于 Java 应用程序,主线程是 main()方法执行的线索: 对于 Applet 程序,主线程是指挥浏览器加载并执行 Java Appl ...

  6. JAVA线程间的状态转换

    线程间的状态转换:  1. 新建(new):新创建了一个线程对象. 2. 可运行(runnable):线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法.该状态的线程位于可运 ...

  7. java线程四种状态

    一个线程可以有四种状态: 1.新(new), 即线程刚刚创建,而并未执行 2.可运行(runnable),意味着一旦时间分片机制有空闲的CPU周期提供给一个线程,那个线程便可立即开始运行.因此,线程可 ...

  8. java的知识点29——join:合并线程 插队线程、线程的状态

    join:合并线程 插队线程  实例: 爸爸和孩子买烟的故事 /*** join:合并线程 插队线程* 爸爸和孩子买烟的故事* @author Administrator**/ public clas ...

  9. 为什么 Java 线程没有 Running 状态?

    Java虚拟机层面所暴露给我们的状态,与操作系统底层的线程状态是两个不同层面的事.具体而言,这里说的 Java 线程状态均来自于 Thread 类下的 State 这一内部枚举类中所定义的状态: 什么 ...

最新文章

  1. java内存数据管理
  2. ad域帐号登录提示无法处理请求_面试官:说一下单点登录的几种实现方式
  3. python3 获取当前路径_python3获取当前目录(转)
  4. SQL Server 的 Statistics 簡介
  5. node --- 连接mysql(docker环境) Sequelize库
  6. 中科大计算机是一流学科吗,安徽2017双一流学科排行榜:中国科技大学第一
  7. _declspec(naked) 使用
  8. 【Java】反转数组元素
  9. windows--bat--右键菜单
  10. 【CVRP】基于matlab人工鱼群算法求解带容量的车辆路径规划问题【含Matlab源码 1486期】
  11. 深入Golang Runtime之Golang GC的过去,当前与未来
  12. c语言查表程序,C语言查表法问题
  13. UIPATH IE浏览器下载问题
  14. 元数据管理——企业数据治理的基石
  15. Hive 数据倾斜问题定位排查及解决(实际案例)
  16. 使用Fiddler抓取微信小程序二维码请求地址
  17. 2021-10-25win10如何禁用自带的键盘和鼠标
  18. 系统自己弹出诸如 kernel:NMI watchdog: BUG: soft lockup - CPU#2 stuck for 26s [mysqld:2875]
  19. 初探QT+OSG+OCC的CAD平台之GMSH划分后以按面获取相应的点与单元
  20. 5G NR 下行调度算法流程

热门文章

  1. 小白兔写话_二年级写话小白兔
  2. python|简单实现英文单词大小写转化
  3. 找完数——完数的使用
  4. 五、SQL–索引/约束⑥(外键约束)
  5. 中国IT工作者35岁后的发展出路调查报告(2)
  6. arxiv数据_使用neo4j第1部分分析arxiv数据
  7. 音视频学习-h264的NALU结构分析
  8. nginx启动时指定prefix(覆盖编译时的 --prefix)
  9. 迭代式开发使用方法总结
  10. 理解目标检测中的老大难:小目标检测