前言

本文从 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)

OSThread

总结


xingpingz
122 声望64 粉丝

博学,审问,慎思,明辨,力行