java代碼大全及詳解 設置和獲取當前線程名稱


前言
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

    猜你喜歡