前言
本文从 Java Thread 类的 start 方法的内部实现入手,分析 Hotspot JVM 多线程相关的数据结构(类)和原理
Thread 类
start 方法
Thread 类的 start 方法用于启动线程,方法内部调用了 native 方法 start0
public synchronized void start() {
...
try {
start0();
started = true;
} finally {
...}
}
private native void start0();
在 openjdk 源代码中搜索 start0,可以看到 start0 对应 JVM_StartThread native 函数
jdk/src/java.base/share/native/libjava/Thread.c:44:
{"start0", "()V", (void *)&JVM_StartThread},
在 openjdk 源代码中搜索 JVM_StartThread
hotspot/src/share/vm/prims/jvm.cpp:2785:
JVM_ENTRY(void, JVM_StartThread(JNIEnv* env, jobject jthread))
JVM_StartThread 函数核心代码
JVM_ENTRY(void, JVM_StartThread(JNIEnv* env, jobject jthread)) {
JVMWrapper("JVM_StartThread");
JavaThread *native_thread = NULL;
...
JavaThread *native_thread;
...
if (...) {
} else {
jlong size = janga_lang_Thread::stackSize(
JNIHandles::resolve_non_null(jthread));
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);
}
}
...
Thread::start(native_thread);
}
JVM_END
计算 线程堆栈 大小
创建 JavaThread 对象
初始化 osthread ?
启动线程
在创建 JavaThread 时传入了一个函数指针 thread_entry,它是 os thread 的入口函数
static void thread_entry(JavaThread* thread, TRAPS) {
HandleMark hm(THREAD);
Handle obj(THREAD, thread->threadObj());
JavaValue result(T_VOID);
JavaCalls::call_virtual(&result,
obj,
KlassHandle(THREAD, SystemDictionary::Thread_klass()),
vmSymbols::run_method_name(),
vmSymbols::void_method_signature(),
THREAD);
}
JavaCalls::call_virtual 函数用于从 native(C/C++)代码调用 Java 代码,从变量和函数命名很容易看出,thread_entry 函数将调用 Java Thread 对象的 run 方法,将控制逻辑从 native 环境转向 Java 环境
JavaThread
从上文分析 Java Thread 类的 start 方法可以得知 每个 Java Threard 对象在 JVM 内部都有一个 native 对象 JavaThread 与之对应. 我们从构造函数入手分析 JavaThread. thread.cpp 文件中有一段注释描述了 Hotspot 线程类的层次结构:
Class hierarchy
- Thread
- NamedThread
- VMThread
- ConcurrentGCThread
- WorkerThread
- GangWorker
- GCTaskThread
- JavaThread
- various subclasses eg CompilerThread, ServiceThread
- WatcherThread
构造函数
JavaThread::JavaThread(ThreadFunction entry_point, size_t stack_sz) :
Thread() {
initialize();
_jni_attach_state = _not_attaching_via_jni;
set_entry_point(entry_point);
// Create the native thread itself.
// %note runtime_23
os::ThreadType thr_type = os::java_thread;
thr_type = entry_point == &compiler_thread_entry ? os::compiler_thread :
os::java_thread;
os::create_thread(this, thr_type, stack_sz);
}
根据 entry_point(线程入口函数指针)确定线程线程 thr_type
调用 os::create_thread 创建 os thread(pthread)
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。