JVM线程创建概述

JVM线程和OS操作系统线程的关系
linux操作系统的线程控制原语
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg);(具体确认待考证)这个函数是linux系统的函数,可以用C或者C++直接调用,上面信息也告诉程序员这个函数在pthread.h, 这个函数有四个参数
| pthread_t *thread | 传出参数,调用之后会传出被创建线程的id |定义 pthread_t pid; 继而 取地址 &pid
|const pthread_attr_t *attr|线程属性,关于线程属性是linux的知识|在学习pthread_create函数的时候一般穿NULL,保持默认属性
| void *(*start_routine) (void *) | 线程的启动后的主体函数 相当于java当中的run |需要你定义一个函数,然后传函数名即可
| void *arg | 主体函数的参数 |如果没有可以传NULL
Thread t1 =new Thread()创建线程类的对象,Java层面上称为创建一个线程,但CPU和OS层面,此时没有产生线程。当t1调用start()方法时,Java称之为线程就绪。public synchronized void start() {},内部调用了private native void start0();这里的native方法,
static JNINativeMethod methods[] = {
{“start0”, “()V”, (void *)&JVM_StartThread},
{“stop0”, “(” OBJ “)V”, (void *)&JVM_StopThread},
{“isAlive”, “()Z”, (void *)&JVM_IsThreadAlive},
{“suspend0”, “()V”, (void )&JVM_SuspendThread},
{“resume0”, “()V”, (void )&JVM_ResumeThread},
{“setPriority0”, “(I)V”, (void )&JVM_SetThreadPriority},
{“yield”, “()V”, (void )&JVM_Yield},
{“sleep”, “(J)V”, (void )&JVM_Sleep},
{“currentThread”, “()” THD, (void )&JVM_CurrentThread},
{“countStackFrames”, “()I”, (void )&JVM_CountStackFrames},
{“interrupt0”, “()V”, (void )&JVM_Interrupt},
{“isInterrupted”, “(Z)Z”, (void )&JVM_IsInterrupted},
{“holdsLock”, “(” OBJ “)Z”, (void )&JVM_HoldsLock},
{“getThreads”, “()[” THD, (void )&JVM_GetAllThreads},
{“dumpThreads”, “([” THD “)[[” STE, (void )&JVM_DumpThreads},
{“setNativeName”, “(” STR “)V”, (void )&JVM_SetNativeThreadName},
};
调用了此处的start0函数,然后指针寻找到虚拟机(HotSpot)C++函数库的
int ret = pthread_create(&tid, &attr, (void
(
)(void
)) java_start, thread);方法,此处创建了操作系统级别的线程,开始等待CPU执行。
此处可以看出,hotspot底层借鉴了linux操作系统的线程控制原语,自实现了一套直接生成OS线程的C代码。因此,Java的线程是和OS的线程一一对应的。(此处疑问,那JVM内核线程和系统线程有区别吗,是不是本质上是一个东西?)
JVM线程的start()方法是怎样调用run()方法的
线程t1调用start方法时,public synchronized void start() {},内部调用了private native void start0();这里的native方法,也就是调用了虚拟机(HotSpot)C++函数库的
bool os::create_thread(Thread
thread, ThreadType thr_type, size_t stack_size) {
。。。。。。。
int ret = pthread_create(&tid, &attr, (void
(
)(void
)) java_start, thread);
}
方法,这里传入四个参数,当中的(void
(
)(void
)) java_start,也就是线程启动后的主体函数,即线程执行时会回调这个函数,在openJDK中,(void
(
)(void
)) java_start是这样定义的。
static void *java_start(Thread *thread) {
。。。。。。
thread->run();
return 0;
}
此处最终回调了run()方法。
具体openJDK地址见下图:
在这里插入图片描述
在这里插入图片描述
吐槽,博客排版真难受。。。。直接语雀复制来的,懒得排版了,地址:https://www.yuque.com/aichimaodeyu-yhsuu/mepo5n/uwksl4

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值