网站炫酷首页,机顶盒做网站,网站可以做二维码吗,响应式网站开发公司Java线程是怎么实现run方法的执行的呢#xff1f;【 多线程在JVM中的实现原理剖析】 查看naive state0 方法JVM_StartThread 方法创建操作系统线程操作系统线程执行 本文转载-极客时间
我们知道Java线程是通过行start()方法来启动的#xff0c;线程启动后会执行run方法内的代… Java线程是怎么实现run方法的执行的呢【 多线程在JVM中的实现原理剖析】 查看naive state0 方法JVM_StartThread 方法创建操作系统线程操作系统线程执行 本文转载-极客时间
我们知道Java线程是通过行start()方法来启动的线程启动后会执行run方法内的代码。 Java线程其实是“寄生”在操作系统线程上通过操作系统的线程来实现Java线程的运行。接下来我们就深入源码来看看Java线程是怎么实现“寄生”在操作系统线程上来运行的。
package com.hero.multithreading;
public class ThreadDemo {public static void main(String[] args) {Thread thread new Thread(()-{System.out.println(线程);});thread.start();}
}查看naive state0 方法
从入口开始首先我们进入到Thread类的start方法内可以看到有一个start0()方法的调用 这里是真正启动Java线程的地方 。
start0是一个 native方法 那么start0方法是在哪里实现的呢 在openjdk源码share\native\java\lang\Thread.c 文件中我们可以找到start0的定义Java 线程将start0方法和真正的实现方法JVM_StartThread进行了绑定。也就是说调用start0相当与调用了JVM_StartThread方法。 JNINativeMethod类型的结构体变量JNINativeMethod定义在jni.h中。定义了一个native方法和jni方法的映射关系将Java中的native方法和JVM中真正的实现方法进行绑定。
那么这里就有一个问题registerNatives方法具体是在哪里何时执行映射操作的呢 在JVM首次加载Thread类的时候在Thread类的静态初始化块中调用了native registerNatives方法它对应的Jni方法就是上面的Java_java_lang_Thread_registerNatives方法就是在这里完成了state0和JVM_StartThread的绑定。 JVM_StartThread 方法
至此我们知道执行state0方法就是执行JVM_StartThread方法它定义在hotspot JVM源码文件src\share\vm\prims\jvm.cpp 中。 创建操作系统线程
JVM在所有的操作系统中都实现了os::create_thread我们看linux操作系统的实现在src\os\linux\vm\os_linux.cpp 中 操作系统线程执行
至此一个操作系统线程创建及初始化完毕了我们返回到步骤1.2.3中的JVM_StartThread 方法中最后一行Thread::start(native_thread); 开始执行操作系统线程。 至此操作系统线程为就绪状态等待被CPU选中运行时就会调用执行入口函数java_start调用Java线程的run方法至此Java线程也就同时运行起来了。
小结一下
线程类被JVM加载时完成线程所有native方法和C中的对应方法绑定。Java线程调用start方法start方法 native state0方法 JVM_StartThread 创建JavaThread::JavaThread线程创建OS线程并指定OS线程的运行入口创建JavaThread::JavaThread线程 创建OS线程 os::create_thread 指定OS线程执行入口Java线程的run方法启动OS线程运行时会调用Java线程的run方法至此实现了Java线程的运行。创建线程的时候使用的是互斥锁MutexLocker操作系统互斥量所以说创建线程是一个性能很差的操作