前言
Java 中经常会遇到要获取当前线程的情况,这时一般我们就会通过Thread.currentThread()来获取,接下去就看看执行该语句在 JVM 中做了什么吧。
简单例子
以下是一个简单的例子,获取当前线程并打印线程名称,输出是”main”,即主线程。
public class CurrentThreadTest { public static void main(String[] args) { Thread t = Thread.currentThread(); System.out.println(t.getName()); } } 复制代码
currentThread方法
在 Thread 类中,currentThread是一个静态且本地方法。
public static native Thread currentThread(); 复制代码
Thread.c
Java 层声明的本地方法对应实现在 Thread.c 中,currentThread是一个注册到 JVM 中的方法,它与 JVM 中的JVM_CurrentThread函数绑定了,所以实现逻辑在JVM_CurrentThread函数里。逻辑为:
JVMWrapper("JVM_CurrentThread")用于调试。
通过thread->threadObj()获取 oop,这里的 thread 是在JNI_ENTRY宏中获取到的,详细情况可参考后面的JNI_ENTRY和JNI_END宏。
调用JNIHandles::make_local函数
#define THD "Ljava/lang/Thread;" static JNINativeMethod methods[] =