如果在多核或多处理器机器上运行,其中jvm有可能绝对同时运行多个线程(不仅仅是同时出现),api方法java.lang.Thread.currentThread()
会返回什么?....上面的场景,是否只是随机返回一个当前线程?
答案 0 :(得分:9)
它返回您当前正在运行的线程。如果您有两个核心和两个线程A
和B
完全同时运行,同时调用此方法,它将适当地返回A
和B
。
您的理解是正确的 - 此方法返回的线程始终在运行 - 因为它必须从某个线程调用,并且为了返回,它必须正在运行。不要考虑这个方法:“所有当前正在运行,未暂停,未阻塞的线程”。相反,它的含义是:“给我一个引用我的线程的引用”。
答案 1 :(得分:4)
这很有道理。它返回对正在执行调用代码的线程的引用。
因此,假设您有两个主题threadA
和threadB
。如果在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()只返回一个线程不再有意义
如果您有多个线程,那么只有才有意义。它返回当前运行代码的线程。你无法以任何其他方式获得的东西。