3

jvmが複数のスレッドを完全に同時に実行する可能性があるマルチコアまたはマルチプロセッサマシンで実行している場合(明らかに同時にではなく)、apiメソッドは何をjava.lang.Thread.currentThread()返しますか?....上記のシナリオでは、単に返されますか?ランダムに現在のスレッドの1つ?

4

6 に答える 6

10

現在実行中のスレッドを返します。2 つのコアと 2 つのスレッドがAあり、B完全に同時に実行されている場合、このメソッドを同時に呼び出すと、適切に返さABます。

あなたの理解は一種の正しいです-このメソッドによって返されるスレッドは常に実行されています-スレッドから呼び出される必要があり、戻るには実行されている必要があるためです。この方法について、「現在実行中の、一時停止されていない、ブロックされていないすべてのスレッド」という観点で考えないでください。代わりに、その意味は次のとおりです。「私を実行するスレッドへの参照をください」。

于 2012-08-31T13:58:21.390 に答える
4

それは完全に理にかなっています。呼び出し元のコードを実行しているスレッドへの参照を返します。

したがって、2 つのスレッドがあるとしthreadAますthreadBthreadA呼び出しでコードが実行されている場合はcurrentThread()、 thenthreadAが返されます。同様に、コードがthreadB呼び出しで実行されている場合currentThread()、 thenthreadBが返されます。

私の見解では、ドキュメンテーションはかなり弱いです。それは述べています:

現在実行中のスレッド オブジェクトへの参照を返します。

ここでの「現在」の使用は非常に貧弱です。現在は、「この瞬間に」という意味に解釈されることがよくあります。それがあなたを混乱させたものです。

むしろ皮肉なことに、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

1 つのスレッドだけを返す API メソッド java.lang.Thread.currentThread() はもはや意味がありませんか

複数のスレッドがある場合にのみ意味があります。現在コードを実行しているスレッドを返します。他では得られないもの。

于 2012-08-31T13:59:46.840 に答える