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的调用点有两处:
在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;}
而关于 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);
因此会在方法中最终调用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相关推荐
- linux kvm查看线程状态,kvm线程-005-线程状态-THREAD_JUST_BORN
在kvm内部定义了线程状态,如下: enum { THREAD_JUST_BORN = 1, /* 还没有启动*/ THREAD_ACTIVE = 2, /* 当前正在运行,或者在等待运行的队列中*/ ...
- 面试:为什么 Java 线程没有Running状态?
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源 | my.oschina.net/goldenshaw/bl ...
- 为什么 Java 线程没有 Running 状态?一下被问懵!
什么是 RUNNABLE? 与传统的ready状态的区别 与传统的running状态的区别 当I/O阻塞时 如何看待RUNNABLE状态? Java虚拟机层面所暴露给我们的状态,与操作系统底层的线程状 ...
- JAVA线程六种状态_Java:线程的六种状态及转化
多线程概述及创建方式 Java:线程的六种状态及转化 关于线程的生命周期,网上书上说法不一,难以统一,本篇做一个总结: java.lang.Thread.State枚举类中定义了六种线程的状态,可以调 ...
- 线程五种状态(新建、就绪、运行、阻塞、死亡)
线程的5种状态: 每个 Java 程序都有一个缺省的主线程,对于 Java 应用程序,主线程是 main()方法执行的线索: 对于 Applet 程序,主线程是指挥浏览器加载并执行 Java Appl ...
- JAVA线程间的状态转换
线程间的状态转换: 1. 新建(new):新创建了一个线程对象. 2. 可运行(runnable):线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法.该状态的线程位于可运 ...
- java线程四种状态
一个线程可以有四种状态: 1.新(new), 即线程刚刚创建,而并未执行 2.可运行(runnable),意味着一旦时间分片机制有空闲的CPU周期提供给一个线程,那个线程便可立即开始运行.因此,线程可 ...
- java的知识点29——join:合并线程 插队线程、线程的状态
join:合并线程 插队线程 实例: 爸爸和孩子买烟的故事 /*** join:合并线程 插队线程* 爸爸和孩子买烟的故事* @author Administrator**/ public clas ...
- 为什么 Java 线程没有 Running 状态?
Java虚拟机层面所暴露给我们的状态,与操作系统底层的线程状态是两个不同层面的事.具体而言,这里说的 Java 线程状态均来自于 Thread 类下的 State 这一内部枚举类中所定义的状态: 什么 ...
最新文章
- java内存数据管理
- ad域帐号登录提示无法处理请求_面试官:说一下单点登录的几种实现方式
- python3 获取当前路径_python3获取当前目录(转)
- SQL Server 的 Statistics 簡介
- node --- 连接mysql(docker环境) Sequelize库
- 中科大计算机是一流学科吗,安徽2017双一流学科排行榜:中国科技大学第一
- _declspec(naked) 使用
- 【Java】反转数组元素
- windows--bat--右键菜单
- 【CVRP】基于matlab人工鱼群算法求解带容量的车辆路径规划问题【含Matlab源码 1486期】
- 深入Golang Runtime之Golang GC的过去,当前与未来
- c语言查表程序,C语言查表法问题
- UIPATH IE浏览器下载问题
- 元数据管理——企业数据治理的基石
- Hive 数据倾斜问题定位排查及解决(实际案例)
- 使用Fiddler抓取微信小程序二维码请求地址
- 2021-10-25win10如何禁用自带的键盘和鼠标
- 系统自己弹出诸如 kernel:NMI watchdog: BUG: soft lockup - CPU#2 stuck for 26s [mysqld:2875]
- 初探QT+OSG+OCC的CAD平台之GMSH划分后以按面获取相应的点与单元
- 5G NR 下行调度算法流程