JavaThread如何建立thread0bj和Java线程的关系的呢?

Start方法
public class ThreadDemo {public static void main(String[] args) {Thread t1 = new Thread(){@Overridepublic void run() {System.out.println("java Thread");}};t1.start();}}

可以看到这个方法最核心的就是调用了一个start0方法,而start0方法又是一个native方法(JNI 调用),故而如果要
搞明白start0我们需要查看Hotspot的源码。
linux操作系统的线程
查看Thread.c,可以找到JNI里面start0方法对应的是JVM_StartThread这个方法
Thread.c
jvm.cpp -> JVM_StartThread
JVM_ENTRY(void, JVM_StartThread(JNIEnv* env, jobject jthread))
JVMWrapper("JVM_StartThread");
JavaThread *native_thread = NULL;
bool throw_illegal_thread_state = false;
{
MutexLocker mu(Threads_lock);
if (java_lang_Thread::thread(JNIHandles::resolve_non_null(jthread)) != NULL) {
throw_illegal_thread_state = true;
} else {
jlong size =
java_lang_Thread::stackSize(JNIHandles::resolve_non_null(jthread));
NOT_LP64(if (size > SIZE_MAX) size = SIZE_MAX;)
size_t sz = size > 0 ? (size_t) size : 0;
native_thread = new JavaThread(&thread_entry, sz);
if (native_thread->osthread() != NULL) {
native_thread->prepare(jthread);
}
}
}
可以看到这段代码会创建一个C++ 里面的 JavaThread 对象,然后判断如果当前系统是Linux系统,则会调os_linux.cpp中的create_thread方法
os_linux.cpp -> pthread_create
create_thread最终调用了pthread_create这个命令来创建一个线程
pthread_create

根据man配置的信息可以得出pthread_create会创建一个线程,这个函数是linux系统的函数,可以用C 或者C++直接调用,上面信息也告诉程序员这个函数在pthread.h, 这个函数有四个参数:
thread.c
//头文件
#include <pthread.h>
#include <stdio.h>
//定义一个变量,接受创建线程后的线程id
pthread_t pid;
//定义线程的主体函数
void *thread_entity(void *arg) {
while (1) {
//睡眠100毫秒
usleep(100);
//打印
printf("I am new Thread\n");
}
}
//main方法,程序入口,main和java的main一样会产生一个进程,继而产生一个main线程int
main() {
//调用操作系统的函数创建线程,注意四个参数
pthread_create(&pid, NULL, thread_entity, NULL);
//usleep是睡眠的意思,那么这里的睡眠是让谁睡眠呢?
//为什么需要睡眠?如果不睡眠会出现什么情况
while(1){
//睡眠100毫秒
usleep(100);
//打印
printf("I am main\n");
}
return 0;
}
- 编译该文件
gcc thread.c -o thread.out -pthread
- 执行thread.out








