如果在多核或多处理器机器上运行 jvm 有可能绝对同时运行多个线程(不仅仅是同时运行),那么 api 方法会java.lang.Thread.currentThread()
返回什么?......在上述情况下,它是否只是返回随机当前线程之一?
6 回答
它返回您当前正在其中运行的线程。如果你有两个核心和两个线程A
并且B
完全并发运行,同时调用这个方法,它会A
适当地返回B
。
您的理解是正确的 - 此方法返回的线程始终在运行 - 因为它必须从某个线程调用并且为了返回,它必须正在运行。不要从“所有当前正在运行的、非暂停的、非阻塞的线程”的角度来考虑这种方法。相反,它的意思是:“给我一个运行我的线程的参考”。
这很有意义。它返回对正在执行调用代码的线程的引用。
因此,假设您有两个线程,threadA
并且threadB
. 如果代码在threadA
调用中运行currentThread()
,threadA
则将被返回。同样,如果代码在threadB
调用中运行currentThread()
,则threadB
返回。
在我看来,文档非常薄弱。它指出:
返回对当前正在执行的线程对象的引用。
“当前”在这里的使用很差。当前通常被解释为“此时此刻”。这让你感到困惑。
颇具讽刺意味的是,MSDN (!) 文档对此进行了更好的尝试:
获取
Thread
正在调用当前代码块的对象。
但他们还是落入了使用“电流”的陷阱。哦,编写技术文档的陷阱!
jvm has the potential to run more than one thread absolutely simultaneously
是的,它是真实的。在多核/多处理器系统中,可能有多个当前正在运行的线程。JVM 中运行着一些后台线程,您在每个系统上都拥有这些线程,甚至在single processor
系统中也是如此。
该方法的目的java.lang.Thread.currentThread()
是返回正在运行调用该方法的当前代码的 Thread 对象。
java.lang.Thread.currentThread()
返回执行包含您的代码的方法的线程。
这并不意味着没有其他线程同时运行。
如果您想查看差异,您可以使用这段代码迭代所有当前正在运行的线程:
for (Thread t : Thread.getAllStackTraces().keySet()) {
if (t.getState()==Thread.State.RUNNABLE) {
// see !
}
}
(或简单地计算它们)
它返回对当前正在执行的线程对象的引用。
请参阅:http ://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html
仅返回一个线程的 api 方法 java.lang.Thread.currentThread() 是否不再有意义
仅当您有多个线程时才有意义。它返回当前运行代码的线程。你无法通过任何其他方式获得的东西。