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