jvmが複数のスレッドを完全に同時に実行する可能性があるマルチコアまたはマルチプロセッサマシンで実行している場合(明らかに同時にではなく)、apiメソッドは何をjava.lang.Thread.currentThread()
返しますか?....上記のシナリオでは、単に返されますか?ランダムに現在のスレッドの1つ?
6 に答える
現在実行中のスレッドを返します。2 つのコアと 2 つのスレッドがA
あり、B
完全に同時に実行されている場合、このメソッドを同時に呼び出すと、適切に返さA
れB
ます。
あなたの理解は一種の正しいです-このメソッドによって返されるスレッドは常に実行されています-スレッドから呼び出される必要があり、戻るには実行されている必要があるためです。この方法について、「現在実行中の、一時停止されていない、ブロックされていないすべてのスレッド」という観点で考えないでください。代わりに、その意味は次のとおりです。「私を実行するスレッドへの参照をください」。
それは完全に理にかなっています。呼び出し元のコードを実行しているスレッドへの参照を返します。
したがって、2 つのスレッドがあるとしthreadA
ますthreadB
。threadA
呼び出しでコードが実行されている場合はcurrentThread()
、 thenthreadA
が返されます。同様に、コードがthreadB
呼び出しで実行されている場合currentThread()
、 thenthreadB
が返されます。
私の見解では、ドキュメンテーションはかなり弱いです。それは述べています:
現在実行中のスレッド オブジェクトへの参照を返します。
ここでの「現在」の使用は非常に貧弱です。現在は、「この瞬間に」という意味に解釈されることがよくあります。それがあなたを混乱させたものです。
むしろ皮肉なことに、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
1 つのスレッドだけを返す API メソッド java.lang.Thread.currentThread() はもはや意味がありませんか
複数のスレッドがある場合にのみ意味があります。現在コードを実行しているスレッドを返します。他では得られないもの。