2012-08-31 58 views
2

如果在多核或多处理器机器上运行,其中jvm可能绝对同时运行多个线程(不只是同时发生),那么api方法java.lang.Thread.currentThread()会返回什么?....在上述场景中,它只是随机返回一个当前线程?多核/多处理器系统上Thread.currentThread()的语义?

+3

'Thread.currentThread()'返回一个对你正在调用'Thread.currentThread()'的线程的引用。 –

回答

8

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

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

+0

这对我来说非常有意义,谢谢 –

3

它非常有意义。它返回一个对执行调用代码的线程的引用。

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

documentation在我看来很弱。它指出:

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

此处“目前”的使用非常差。目前经常被解释为“在这个瞬间”。这是什么让你困惑。 (!)

而讽刺的是,MSDN文档,使一个更好的刺吧:

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

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

+0

我完全不得不以这种方式改变我对静力学的看法,谢谢 –

+0

这是一个非常有同情心的更新,谢谢! –

1

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

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

如果你想看到的差异,您可以在当前运行的所有线程重复着这片代码:

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

(或简称count them

0

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

有道理的,如果你有多个线程。它返回当前运行代码的线程。你无法获得任何其他方式的东西。

3

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

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

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

相关问题