jdk包含了

  1. sun提供的java库, C文件, C++实现的hostpot
  2. 调用start0()方法, 会通过C文件,去调用hotspot,去通过操作系统函数,创建一个线程
  3. hotspot会将java的thread和他创建的线程绑定起来
  4. 也就是说java线程和操作系统的线程一一对应

java -> C -> C++ -> 系统函数 ->创建线程

java调用自己写的c库流程

生成链接库

  1. 编写java文件
  2. 编译成class文件
  3. class文件再编译成.h文件,记住他的方法
  4. 再编写c文件引入头文件,生成一个和h一样的方法,c文件方法是编写我们要实现的逻辑
  5. 再将c文件编译成动态链接库(so文件 或者 dll文件)

解析类,把这个threadNew.c编译成为一个动态链接库,这样在java代码里会被load到内存

  1. 需要配置path变量,可以找到so文件的路径
    1. export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:{libLubanThreadNative.so}所在的

链接到c库

java -> load 动态链接库 -> 调用native方法 -> h文件的方法 ->动态链接(linux是 so文件, win是 dll文件) -> 链接到c文件-> 调用c文件方法

java start 如何调用到run方法

Thread如何操作系统 - 图1
java层面: start -> start0() -> native start0()
C(jvm)层面: JVM_StartThread()
OS层面: pthread_create() 这里会回调jvm的run方法