JUC学习-6-浅谈线程原理及相关JVM源码解读
JUC学习-6-浅谈线程原理及相关JVM源码解读
JAVA线程实现原理
// 实现runnable接口
public class MyRunnable implements Runnable {
@Override
public void run() {
}
}
// 集成Thread类
class MyThread extends Thread {
@Override
public void run() {
super.run();
}
}
// 调用线程
class RunTest {
public static void main(String[] args) {
Thread t1 = new Thread(new MyRunnable());
t1.start();
Thread t2 = new MyThread();
t2.start();
}
}
二、函数式接口 Runnable
从Runnable源码可以看到,被@FunctionalInterface修饰,是一个函数式接口,可以用lambda方式引用
// Thread t1 = new Thread(new MyRunnable());
// t1 可以转变成以下lambda形式
Thread t1 = new Thread(() -> {
System.out.println("lambda表达式");
});
三、start0()方法源码
3.1、调用start0()
3.2、Java当中方法用”native“修饰符修饰,是 JNI 方法。
3.3、查看JVM源码
// JVM_StartThread 是 HotSpot 虚拟机中实现 Java 线程启动的 JNI 入口函数
JVM_ENTRY(void, JVM_StartThread(JNIEnv* env, jobject jthread))
// JVMWrapper 是调试工具,用于记录函数调用信息
JVMWrapper("JVM_StartThread");
// 初始化 native_thread 指针,用于保存新创建的 JavaThread 对象
JavaThread *native_thread = NULL;
// 异常处理标志,用于标记是否抛出 IllegalThreadStateException
bool throw_illegal_thread_state = false;
// 加锁区域开始(Threads_lock 是全局线程列表锁)
{
// MutexLocker 是 RAII 锁,构造函数加锁,析构函数解锁
MutexLocker mu(Threads_lock);
// 检查 Java 层的 Thread 对象是否已经关联了 native 线程(防止重复启动)
if (java_lang_Thread::thread(JNIHandles::resolve_non_null(jthread)) != NULL) {
// 如果已关联,设置异常标志
throw_illegal_thread_state = true;
} else {
// 获取 Java 线程设置的栈大小(jlong 类型)
jlong size = java_lang_Thread::stackSize(JNIHandles::resolve_non_null(jthread));
// 将栈大小转为 size_t(处理负数情况)
size_t sz = size > 0 ? (size_t) size : 0;
// 创建 JavaThread 对象:
// &thread_entry 是线程启动后的入口函数
// sz 是栈大小
native_thread = new JavaThread(&thread_entry, sz);
// 检查操作系统线程是否创建成功
if (native_thread->osthread() != NULL) {
// 准备线程对象(关联 Java Thread 和 JavaThread)
native_thread->prepare(jthread);
}
}
} // 自动释放 Threads_lock
// 如果检测到非法线程状态(重复启动)
if (throw_illegal_thread_state) {
// 抛出 IllegalThreadStateException
THROW(vmSymbols::java_lang_IllegalThreadStateException());
}
// 断言确保 native_thread 非空
assert(native_thread != NULL, "Starting null thread?");
// 检查操作系统线程是否创建失败
if (native_thread->osthread() == NULL) {
// 清理 native_thread 对象
delete native_thread;
// 如果启用了 JVMTI 资源耗尽事件,发送通知
if (JvmtiExport::should_post_resource_exhausted()) {
JvmtiExport::post_resource_exhausted(
JVMTI_RESOURCE_EXHAUSTED_OOM_ERROR | JVMTI_RESOURCE_EXHAUSTED_THREADS,
"unable to create new native thread");
}
// 抛出 OOM 异常
THROW_MSG(vmSymbols::java_lang_OutOfMemoryError(),
"unable to create new native thread");
}
// 如果启用了 JFR(Java Flight Recorder)
#if INCLUDE_JFR
if (JfrRecorder::is_recording() && EventThreadStart::is_enabled() &&
EventThreadStart::is_stacktrace_enabled()) {
// 获取线程的 JFR 本地存储
JfrThreadLocal* tl = native_thread->jfr_thread_local();
// 记录线程启动的堆栈(跳过 Thread.start() 和 Thread.start0() 两层)
tl->set_cached_stack_trace_id(JfrStackTraceRepository::record(thread, 2));
}
#endif
// 最终启动线程(调用操作系统的线程创建接口)
Thread::start(native_thread);
JVM_END
四、底层执行完操作步骤以后,会回调run()方法
五、target.run()中的这个target就是传递过来的Runnable参数,也就是说无论是extends Thread还是implements Runnable 最后都是Runnable 执行的run()方法。
本文来自博客园,作者:skystrivegao,转载请注明原文链接:https://www.cnblogs.com/skystrive/p/18947312
整理不易,如果对您有所帮助 请点赞收藏,谢谢~