多核/多处理器系统上Thread.currentThread()的语义?

时间:2012-08-31 13:56:24

标签: java multithreading multicore

如果在多核或多处理器机器上运行,其中jvm有可能绝对同时运行多个线程(不仅仅是同时出现),api方法java.lang.Thread.currentThread()会返回什么?....上面的场景,是否只是随机返回一个当前线程?

6 个答案:

答案 0 :(得分:9)

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

您的理解是正确的 - 此方法返回的线程始终在运行 - 因为它必须从某个线程调用,并且为了返回,它必须正在运行。不要考虑这个方法:“所有当前正在运行,未暂停,未阻塞的线程”。相反,它的含义是:“给我一个引用我的线程的引用”。

答案 1 :(得分:4)

这很有道理。它返回对正在执行调用代码的线程的引用。

因此,假设您有两个主题threadAthreadB。如果在threadA中运行的代码调用currentThread(),则会返回threadA。同样,如果在threadB中运行的代码调用currentThread(),则会返回threadB

我认为documentation非常弱。它声明:

  

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

这里“使用”非常差。目前通常被解释为“在这个时刻”。这让你很困惑。

相当具有讽刺意味的是,MSDN(!)文档可以更好地刺激它:

  

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

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

答案 2 :(得分:3)

jvm has the potential to run more than one thread absolutely simultaneously

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

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

答案 3 :(得分:1)

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

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

如果你想看到差异,你可以用这段代码迭代所有当前运行的线程:

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

(或简称count them

答案 4 :(得分:0)

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

请参阅:http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html

答案 5 :(得分:0)

  

api方法java.lang.Thread.currentThread()只返回一个线程不再有意义

如果您有多个线程,那么只有才有意义。它返回当前运行代码的线程。你无法以任何其他方式获得的东西。