多核/多处理器系统中Thread.currentThread()的语义是什么?

3
如果在多核或多处理器机器上运行,其中jvm有可能同时运行多个线程(不仅是表面上的同时),那么api方法java.lang.Thread.currentThread()返回什么?在上述情况下,它是否只是随机返回当前线程中的一个?

3
Thread.currentThread() 返回一个引用,指向你正在其中调用 Thread.currentThread() 的线程。 - Eng.Fouad
6个回答

10

该方法返回当前正在运行的线程。如果你有两个处理器核心和两个线程 AB 正在完全并发地运行,同时调用此方法,它将适当地返回 AB

你的理解有点正确——此方法返回的线程始终在运行——因为它必须从某个线程中调用,并且为了返回结果,它必须正在运行。不要把这个方法想成是“所有当前正在运行、未暂停、未阻塞的线程”。而是其含义是:“给我一个引用以指向运行我的线程”。


“给我一个引用,指向正在运行我的线程” - 实际上完美地概括了它。 - RRM

4

这完全合理。它返回正在执行调用代码的线程的引用。

假设您有两个线程threadAthreadB。如果运行在threadA中的代码调用currentThread(),则将返回threadA。同样,如果运行在threadB中的代码调用currentThread(),则返回threadB

文档在我看来相当薄弱。它声明:

返回对当前正在执行的线程对象的引用。

在此处使用“当前”非常不好。目前经常被解释为“在此时刻”。这就是让你困惑的原因。

很有趣的是,MSDN(!)文件对此有更好的解释:

获取调用当前代码块的Thread对象。

但他们仍然陷入使用“current”的陷阱。哦,技术文档写作的陷阱!


我必须完全改变我对静态的思考方式,谢谢。 - James B

3

jvm具有绝对同时运行多个线程的潜力

是的,这是真的。在多核/多处理器系统中,可以拥有多个当前正在运行的线程。即使在单处理器系统上也会有一些后台线程在JVM中运行。

java.lang.Thread.currentThread()方法的目的是返回正在调用该方法的当前代码所运行的线程对象。


1

java.lang.Thread.currentThread() 返回执行代码的方法所在的线程。

这并不意味着没有其他线程同时运行。

如果您想看到区别,可以使用以下代码迭代所有当前正在运行的线程:

for (Thread t : Thread.getAllStackTraces().keySet()) {
    if (t.getState()==Thread.State.RUNNABLE) {
          // see !
    }
}

或只需使用计数功能


0

“Currently executing” 这个说法有点含糊不清。 - David Heffernan
2
是的,文档不够清晰。 - David Heffernan

0
Java.lang.Thread.currentThread()这个API方法只有在存在多个线程的情况下才有意义。它返回当前正在运行代码的线程,这是通过其他方式无法获得的信息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接