Java 线程实现原理
2021-06-05 12:03
标签:virtual result sha rgs cpp 设置 function pre 信息 注册的信息定义在这里 构造方法在 Java 线程实现原理 标签:virtual result sha rgs cpp 设置 function pre 信息 原文地址:https://www.cnblogs.com/xch-jiang/p/14629012.htmlLinux 操作系统中创建线程的方式
int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);
参数名
参数定义
参数解释
pthread_t *thread
传出参数,调用之后会传出被创建线程的id
const pthread_attr_t *attr
线程属性
一般传 NULL,保持默认属性
void *(*start_routine) (void *)
线程启动后的主体函数
void *arg
主体函数的参数
#include
Thread#start0
实现原理package java.lang;
public class Thread implements Runnable {
private static native void registerNatives();
static {
registerNatives();
}
// JVM 中并没有 Java_java_lang_Thread_start0 方法,因此这个方法是由 registerNatives() 动态注册的
private native void start0();
}
src/java.base/share/native/libjava/Thread.c
中:static JNINativeMethod methods[] = {
{"start0", "()V", (void *)&JVM_StartThread},
//......
};
jvm.cpp
:JVM_ENTRY(void, JVM_StartThread(JNIEnv* env, jobject jthread))
// ... 传给构造函数的 entry_point 是 thread_entry 静态方法
native_thread = new JavaThread(&thread_entry, sz);
// ...
}
Thread.cpp
:JavaThread::JavaThread(ThreadFunction entry_point, size_t stack_sz) : JavaThread() {
// ... 传进来的 thread_entry 静态方法设置为 entry_point
set_entry_point(entry_point);
// ... 启动线程
os::create_thread(this, thr_type, stack_sz);
}
os_linux.cpp
:// 实现 run() 方法回调
static void *thread_native_entry(Thread *thread) {
// ...
thread->call_run();
// ...
}
// 启动线程
bool os::create_thread(Thread* thread, ThreadType thr_type,
size_t req_stack_size) {
// ... pthread 创建线程
int ret = pthread_create(&tid, &attr, (void* (*)(void*)) thread_native_entry, thread);
// ...
}
thread.cpp
:void Thread::call_run() {
// ... 实际类型是 JavaThread,所以调用 JavaThread::run()
this->run();
// ...
}
void JavaThread::run() {
// ...
thread_main_inner();
}
void JavaThread::thread_main_inner() {
// ... entry_point 是 thread_entry 静态方法 (构造方法中传进来的)
this->entry_point()(this, this);
// ...
}
jvm.cpp
:static void thread_entry(JavaThread* thread, TRAPS) {
HandleMark hm(THREAD);
Handle obj(THREAD, thread->threadObj());
JavaValue result(T_VOID);
// 回调 Java 方法
JavaCalls::call_virtual(&result, // 返回对象
obj, // 实例对象
vmClasses::Thread_klass(), // 类
vmSymbols::run_method_name(), // 方法名
vmSymbols::void_method_signature(), // 方法签名
THREAD);
}
vmSymbols.hpp
:// 回调的方法名写死为 "run"
template(run_method_name, "run")
// 方法签名写死为 无参无返回值
template(void_method_signature, "()V")
javaCalls.cpp
中回调 Java 方法:void JavaCalls::call_virtual(JavaValue* result, Klass* spec_klass, Symbol* name, Symbol* signature, JavaCallArguments* args, TRAPS) {
// ... 不在往下深入了
JavaCalls::call(result, method, args, CHECK);
}
上一篇:java_判空工具类