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表达式");
		});

image

三、start0()方法源码

image

3.1、调用start0()

image

3.2、Java当中方法用”native“修饰符修饰,是 JNI 方法。

image

3.3、查看JVM源码

利用TortoiseHg下载jdk8源码和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()方法

image

五、target.run()中的这个target就是传递过来的Runnable参数,也就是说无论是extends Thread还是implements Runnable 最后都是Runnable 执行的run()方法。

image


image

posted @ 2025-06-25 10:32  skystrivegao  阅读(18)  评论(0)    收藏  举报