设置和获取当前线程名称 java代码大全及详解

前言Java经常会遇到获取当前线程的情况。这时候我们一般通过Thread.currentThread()来获取。接下来,让我们看看这条语句的执行在JVM中做了什么。简单的例子下面是一个简单的例子。获取当前线程并打印线程名。输出是”***in & # 8221,也就是主线程。public class Curren...

前言

Java经常会遇到获取当前线程的情况。这时候我们一般通过Thread.currentThread()来获取。接下来,让我们看看这条语句的执行在JVM中做了什么。

简单的例子

下面是一个简单的例子。获取当前线程并打印线程名。输出是”***in & # 8221,也就是主线程。

public class CurrentThreadTest { public static void ***in(String[] args) { Thread t = Thread.currentThread(); System.out.println(t.getName()); }}

当前线程方法

在Thread类中,currentThread是一个静态的局部方法。

public static native Thread currentThread();

Thread.c

Java层声明的本地方法在Thread中实现,c currentThread是在JVM中注册的方法,绑定了JVM_CurrentThread函数,所以实现逻辑在JVM_CurrentThread函数中。逻辑是:

JVMWrapper(“JVM_CurrentThread”)用于调试。通过thread->threadObj()获取 oop,这里的 thread 是在JNI_ENTRY宏中获取到的,详细情况可参考后面的JNI_ENTRY和JNI_END宏。调用JNIHandles::***ke_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::***ke_local(env, jthread);JVM_END

***ke_local函数主要看
thread _ from _ JNI _环境函数,用来获取当前线程。它的逻辑是Java thread * thread _ from _ JNI _ env =(Java thread *)((intptr _ t)env –in _ bytes(JNI _ environment _ offset());也就是直接减去地址偏移量就可以得到JavaThread*。这是因为JavaThread对象包含JNIEnv对象的属性,所以可以通过从偏移量中减去JNIEnv*来计算JavaThread*。最后,检查线程是否已经终止,然后返回线程对象。

得到JavaThread*对象后,给句柄赋值,给句柄赋值oop,变成Java层对象JobProject。

jobject JNIHandles::***ke_local(JNIEnv* env, oop obj) { if (obj == NULL) { return NULL; } else { JavaThread* thread = JavaThread::thread_from_jni_environment(env); assert(Universe::heap()->is_in_reserved(obj), "sanity check"); return thread->active_handles()->allocate_handle(obj); }}static JavaThread* thread_from_jni_environment(JNIEnv* env) { JavaThread *thread_from_jni_env = (JavaThread*)((intptr_t)env - in_bytes(jni_environment_offset())); if (thread_from_jni_env->is_terminated()) { thread_from_jni_env->block_if_vm_exited(); return NULL; } else { return thread_from_jni_env; } }

“JNI _ entry”和“JNI _ end”宏

这两个宏提取了共同的部分。JNI_END相对简单,只有两个右括号。

#define JNI_ENTRY(result_type, header) JNI_ENTRY_NO_PRESERVE(result_type, header) WeakPreserveExceptionMark __wem(thread);#define JNI_END } }

JNI _入口的主要逻辑:

获取当前执行线程 JavaThread 指针对象。创建 ThreadInVMfromNative 对象。TRACE_CALL ,这里什么都不干。创建 HandleMarkCleaner 对象。将 thread 赋值给 Exceptions 中的 THREAD。校验栈对齐。创建 WeakPreserveExceptionMark 对象。#define JNI_ENTRY_NO_PRESERVE(result_type, header) \extern "C" { \ result_type JNICALL header { \ JavaThread* thread=JavaThread::thread_from_jni_environment(env); \ assert( !VerifyJNIEnvThread || (thread == Thread::current()), "JNIEnv is only valid in same thread"); \ ThreadInVMfromNative __tiv(thread); \ debug_only(VMNativeEntryWrapper __vew;) \ VM_ENTRY_BASE(result_type, header, thread)#define VM_ENTRY_BASE(result_type, header, thread) \ TRACE_CALL(result_type, header) \ HandleMarkCleaner __hm(thread); \ Thread* THREAD = thread; \ os::verify_stack_alignment();

本文来自清杉投稿,不代表舒华文档立场,如若转载,请注明出处:https://www.chinashuhua.cn/24/509082.html

打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
() 0
上一篇 04-18
下一篇 04-18

相关推荐

  • 爬虫软件哪个好用 获取客户数据的软件推荐

    目前市场上常用的爬虫工具可以分为云网络爬虫和数据采集器两大类(除了自己开发设计的爬虫工具和爬虫框架)。云爬虫就是不需要下载安装程序。您可以在网页上构建网络爬虫,并在web服务器上运行它。网站提供网络带宽和24小时服务。数据采集器一般是指安装下载,然后构建一个网络

    2023-07-29 11:25:01
    271 0
  • 红米手机root权限获取 红米手机专用root工具

    想法分为以下几点:1.正式解锁BL锁2.解锁后刷入note8专用REC(注意和note8pro不一样)3.刷入REC后,打开高级选项,先点击“签名根”。选择“root系统”后,重启定位器,ROOT已经完成。注意:root的前提下,必须先解锁官方BL锁。解锁官方BL锁流程:1.登录定位器小米账号,连续点击版

    2023-07-28 21:01:01
    949 0
  • 怎么获取root权限小米,分享两种超实用的方法

    前言:海德里诺。:长时间在线知识分享。关于如何获得root权限,Android前面写了很多相关的解锁教程。之前的都是相关通用教程。查看之前的文章,可以点击我的头像,关注我,查看我的头条文章列表。任何安卓***在获得root权限之前,都必须解锁。今天,我分享了我很久以来关于互联

    2023-07-27 04:53:01
    926 0
  • 《江南百景图》树苗获取方法介绍 树苗怎么获得

    江南百景图树苗是最近刚在游戏中出现的产品,因为2022年的植树节马上就要到了,大家都可以在游戏中获得树苗。有好的获取小树苗方法的手游小编会在下面的攻略中分享给大家,玩家可以快速参考攻略,找出获取的方法。江南百景取苗方法介绍一、采集方式:是树苗游戏中植物节交换的

    2023-07-26 23:55:01
    450 0

评论列表

联系我们

在线咨询: QQ交谈

邮件:admin@qq.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信