博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
OpenJDK9 Hotspot : Thread
阅读量:6408 次
发布时间:2019-06-23

本文共 2776 字,大约阅读时间需要 9 分钟。

前言

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

总结

转载地址:http://nbhea.baihongyu.com/

你可能感兴趣的文章
我的友情链接
查看>>
20165226 MySort的实现
查看>>
12.linux关机命令
查看>>
java计算运行时间
查看>>
PHP在Windows7环境下的设置
查看>>
C#实现树型结构TreeView节点拖拽的简单功能,附全部源码,供有需要的参考
查看>>
解决Android模拟器上不了网的方法
查看>>
使用putty连接本机上VirtualBox中的linux
查看>>
【cocos2dx进阶】调试篇(2)Cocos2dx的一些小改造
查看>>
64位centos安装flash插件
查看>>
Centos_6.5之DNS服务器
查看>>
运维学python之爬虫工具篇(六)Pyquery的用法
查看>>
将历史记录时间戳替换为标准时间
查看>>
使用jQuery Mobile的注意事项(译)
查看>>
Jmeter基础之---jmeter基础概念
查看>>
SQL Server 打造完整的数据备份体系
查看>>
Windows server 2003域控直接迁移到2012
查看>>
MFC图像处理-图像扫描显示之扫描显示
查看>>
我的友情链接
查看>>
5.Linux 软件安装管理
查看>>