image.png

image.png
image.png
image.png
image.png
image.png
image.png

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

image.png
Start方法

  1. public class ThreadDemo {
  2. public static void main(String[] args) {
  3. Thread t1 = new Thread(){
  4. @Override
  5. public void run() {
  6. System.out.println("java Thread");
  7. }
  8. };
  9. t1.start();
  10. }
  11. }

image.png
可以看到这个方法最核心的就是调用了一个start0方法,而start0方法又是一个native方法(JNI 调用),故而如果要
搞明白start0我们需要查看Hotspot的源码。

linux操作系统的线程

查看Thread.c,可以找到JNI里面start0方法对应的是JVM_StartThread这个方法

Thread.c

image.png

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方法

image.png

os_linux.cpp -> pthread_create

create_thread最终调用了pthread_create这个命令来创建一个线程
image.png
image.png

pthread_create

image.png
根据man配置的信息可以得出pthread_create会创建一个线程,这个函数是linux系统的函数,可以用C 或者C++直接调用,上面信息也告诉程序员这个函数在pthread.h, 这个函数有四个参数:image.png

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

image.png