前言
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[] = { ... {"currentThread", "()" THD, (void *)&JVM_CurrentThread}, ...};JVM_ENTRY(jobject, JVM_CurrentThread(JNIEnv* env, jclass threadClass)) JVMWrapper("JVM_CurrentThread"); oop jthread = thread->threadObj(); assert (thread != NULL, "no current thread!"); return JNIHandles::make_local(env, jthread);JVM_END make_local函數中主要看
thread_from_jni_environment函數,它用于獲取當前線程,它的邏輯為JavaThread *thread_from_jni_env = (JavaThread*)((intptr_t)env – in_bytes(jni_environment_offset()));,即直接通過地址偏移來做減法計算得到JavaThread*,這是因為 JavaThread 對象包含了 JNIEnv 對象屬性,所以可以通過JNIEnv*與偏移做減法來算出JavaThread* 。最后還要檢查線程是否已經終止狀態,沒有終止才返回該線程對象 。
獲取到JavaThread*對象后,分配句柄并將 oop 賦給句柄,并且轉成 Java 層的對象 jobject 。
jobject JNIHandles::make_local(JNIEnv* env, oop obj) { if (obj == NULL) { return NULL;} else { JavaThread* thread = JavaThread::thread_from_jni_enviro
猜你喜歡
- 上古卷軸5買房子代碼是什么
- 拒絕酒駕的宣傳標語 關于拒接酒駕的宣傳標語大全
- 晚安說說簡短句子大全 晚安句子大全簡單正能量
- 狗尾紅大圖圖片大全!狗尾紅高清大圖一覽!
- 肉灰蓉燉牛鞭- 燉牛鞭的做法大全集
- 2021牛年好聽順口的女孩名字大全 2021女孩寶寶的好聽寓意好的名字
- qq免費黑色皮膚代碼 誰有
- 煲湯的做法大全家常 3種家常湯的做法簡單好喝
- 思字開頭的成語 思字開頭的成語大全
- 免費分享其直播順口溜大全 快手點關注不迷路的順口溜
