1 | Thread t = new Thread(new Runnable() { |
上面这段代码在JVM中是如何实现的呢?
- 我们需要熟悉JNI
打开Thread.java
1
2
3
4
5
6
7
8
9public
class Thread implements Runnable {
/* Make sure registerNatives is the first thing <clinit> does. */
private static native void registerNatives();
static {
registerNatives();
}
// ...
}
了解过JNI,那么我们知道Thread.java一定会对应一个c或c++文件,那么在JVM中Thread.java对应的C文件是openjdk-jdk8u-jdk8u\jdk\src\share\native\java\lang\Thread.c
打开Thread.c,发现这个文件很简单
1 |
|
我们可以看到methods定义了所有的native方法。Java_java_lang_Thread_registerNatives恰好对应的是java.lang.Thread中的registerNatives()方法。
当执行t.start()的时候,发生了什么呢?
我们知道在执行t.start()的时候,jdk代码中会去执行start0的native方法那么对应的就是JVM_StartThread。
我们找到JVM_StartThread
openjdk-jdk8u-jdk8u\hotspot\src\share\vm\prims\jvm.h
openjdk-jdk8u-jdk8u\hotspot\src\share\vm\prims\jvm.cpp
在C/C++中.h .hpp文件为头文件,可以理解为啥呢,Java中的接口文件(类似哈,请不要较真)
.c .cpp为具体的实现文件。
在jvm.cpp找到JVM_ENTRY(void, JVM_StartThread(JNIEnv* env, jobject jthread))创建线程的入口。
其中第6步的new JavaThread在openjdk-jdk8u-jdk8u\hotspot\src\share\vm\runtime\thread.cpp
JavaThread::JavaThread(ThreadFunction entry_point, size_t stack_sz)
在调用pthread_create的时候,这里涉及到具体的操作系统
1 | linux: |
本文标题:JVM如何创建线程
本文链接:https://xxzkid.github.io/2020/jvm-create-thread/