3

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

4

6 回答 6

10

它返回您当前正在其中运行的线程。如果你有两个核心和两个线程A并且B完全并发运行,同时调用这个方法,它会A适当地返回B

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

于 2012-08-31T13:58:21.390 回答
4

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

因此,假设您有两个线程,threadA并且threadB. 如果代码在threadA调用中运行currentThread()threadA则将被返回。同样,如果代码在threadB调用中运行currentThread(),则threadB返回。

在我看来,文档非常薄弱。它指出:

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

“当前”在这里的使用很差。当前通常被解释为“此时此刻”。这让你感到困惑。

颇具讽刺意味的是,MSDN (!) 文档对此进行了更好的尝试:

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

但他们还是落入了使用“电流”的陷阱。哦,编写技术文档的陷阱!

于 2012-08-31T13:57:45.907 回答
3

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

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

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

于 2012-08-31T14:00:46.820 回答
1

java.lang.Thread.currentThread()返回执行包含您的代码的方法的线程。

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

如果您想查看差异,您可以使用这段代码迭代所有当前正在运行的线程:

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

 (或简单地计算它们

于 2012-08-31T13:58:15.810 回答
0

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

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

于 2012-08-31T13:58:27.163 回答
0

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

当您有多个线程时才有意义。它返回当前运行代码的线程。你无法通过任何其他方式获得的东西。

于 2012-08-31T13:59:46.840 回答