Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Thread.currentThread()是如何工作的?_Java_Multithreading - Fatal编程技术网

Java Thread.currentThread()是如何工作的?

Java Thread.currentThread()是如何工作的?,java,multithreading,Java,Multithreading,Thread.currentThread()是一种静态方法,它提供对当前正在执行的线程的引用(基本上是对“this”线程的引用) 在Java中不可能在静态方法中访问非静态成员(尤其是this),因此currentThread()是本机方法 currentThread()方法在幕后是如何工作的 (basically a reference to 'this' thread) 此处不涉及此参考 您将一个线程混合为本机资源,这意味着执行线程;和线程,这是一个Java类。线程代码不在线程实例的“内部”

Thread.currentThread()
是一种静态方法,它提供对当前正在执行的线程的引用(基本上是对“this”线程的引用)

在Java中不可能在静态方法中访问非静态成员(尤其是
this
),因此
currentThread()
是本机方法

currentThread()
方法在幕后是如何工作的

(basically a reference to 'this' thread)
此处不涉及
参考

您将一个线程混合为本机资源,这意味着执行线程;和
线程
,这是一个Java类。线程代码不在
线程
实例的“内部”运行,该实例只是Java线程控制的句柄。很像
文件
实例不是文件


因此,
Thread.currentThread()
是一种检索
Thread
实例的方法,该实例负责调用方法的执行线程。Java究竟是如何做到这一点的,这是一个实现细节,除非您正在探索某个特定JVM实现的细节,否则您不应该关心这个细节。

您可以查看实现此方法的OpenJDK代码。我猜,它会询问操作系统它在哪个线程上,然后将该线程ID映射到一个线程对象。我不知道
currentThread
的实现细节,但是如果您想在自己的代码中使用相同的通用机制,您可以使用
ThreadLocal
。这个问题很好。特别是,currentThread()返回的对象是否总是与用于启动线程的
Thread
对象相同?它可以为同一个线程创建两个
Thread
对象吗?本机函数能否创建线程并调用Java代码?对于这样的线程,将返回什么
Thread
对象?这不是一个完美的类比,因为文件实例是一个可能在其生存期内解析为多个实际操作系统级文件的路径,而线程实例在其生存期内只表示一个线程。但是线程实例作为句柄的想法是正确的。@JeffreyBosboom
Thread
的生命周期与底层线程之间的不匹配使得这种类比更加有力<代码>线程可以(而且确实)在没有底层执行线程的情况下存在——事实上,可以在不同的时间轻松地表示不同的操作系统级线程(这实际上超出了规范的范围)。@Marko假设我正在探索这里的细节,你能帮我找到currentThread()方法的源代码吗?我很想看看这个方法到底是怎么回事。
Thread.currentThread()
是OpenJDK中的一个本机方法。我还没有试图找到C源代码,但我会这样做:我会在一个固定的内存位置有一个表,其中包含所有线程堆栈的信息。该信息将包括堆栈底部的地址、堆栈的最大大小以及与堆栈关联的
线程
对象的ID
Thread.currentThread()
只需获取其激活记录中任何局部变量的地址,然后查阅表格以确定它属于哪个堆栈,从而确定返回哪个
Thread
。说“不涉及此引用”并不完全准确,因为
this==Thread.currentThread()
在某些情况下是正确的。
Thread.currentThread()
可能会返回您曾经创建的实例,并对这些实例或为您创建的其他
Thread
对象具有一定的控制权。