だから私は自分が作っているゲームのスレッドを操作しようとしています。私はこのテーマに非常に慣れていないので、正しく理解していない可能性があります。私の質問は、Java API の Thread クラスで currentThread() メソッドがどのように機能するかです。APIには「現在実行中のスレッドオブジェクトへの参照を返す」とありますが、私が知る限り複数のスレッドが同時に実行されています。実行中のスレッドを 1 つだけ返すにはどうすればよいですか?
7 に答える
呼び出すコードcurrentThread
は、すべてのスレッドではなく、いずれかのスレッドで実行されるため、そのスレッドを具体的に取得できます。
コード内の命令が実行されると、特定のスレッド内で実行されます。これは、そのメソッドによって返されるスレッドです。
明らかに、特定のメソッドが複数のスレッドによって実行される場合、各実行は に対して異なる値を返す可能性がありますThread.currentThread()
。
この短い例を試すと、何が起こっているのか、特に 2 つのスレッドが並行して実行されるという事実をよりよく理解できます。t1 がいくつかのループを実行し、次に t2 が同じことを実行して t1 に戻ることがわかるはずです (マシンによっては、ループの数を 5 からより多くの数に増やす必要がある場合があります)。
public class TestThread {
public static void main(String[] args) {
Runnable r = new Runnable() {
@Override
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println(Thread.currentThread());
}
}
};
Thread t1 = new Thread(r, "t1");
Thread t2 = new Thread(r, "t2");
t1.start();
t2.start();
}
}
一枚の紙に印刷された指示のリストがあるとします。人は指示を読み、それを実行します。命令はプログラムです。人は糸です。紙をたくさんコピーして、多くの人に配ることができます。指示に「自分を平手打ちする」などと書かれている場合、あなたは、その紙からその指示を読んでいる人を指します。同様に、Thread.currentThread()
は への呼び出しを実行しているスレッドを参照しますcurrentThread()
。
シングル スレッド アプリケーションを作成する場合、一連の命令のようにプログラムを推論することができます。これは、前の命令が終了した後に実行されます (これは大まかな概算ですが、概念的にはコンパイラとプロセッサはそれをシミュレートし、これが実際に実行されたかのように動作します)。何が起こっていた)。
複数のスレッドを使用する場合、各スレッドには独自の一連の命令があります。新しいスレッドが作成されると、エントリ ポイント (メソッド) が渡され、そこから実行が続行されます。各スレッドは、実行時に他のスレッドから独立していますが (命令を次々に実行するだけです)、メモリを共有しているため、1 つのスレッドからの副作用が別のスレッドに影響を与える可能性があります。
したがって、一部のコードを実行するには、1 つのスレッドのコンテキストで実行する必要があります (アプリケーションの起動時にオペレーティング システムによって作成され、Main
メソッドで実行を開始するスレッドがあります)。関数currentThread
が呼び出されると、それらのコンテキストの 1 つになります。
スレッドを作成するときの Java ランタイムは、そのThread
オブジェクトへの参照をスレッド コンテキストに格納し、currentThread
そこを検索して現在のスレッドを返します。
「現在実行中のスレッド」とは、システム スケジューラがこのスレッドにコードを実行する時間を与えたことを意味します。
複数のスレッドが同時に実行されておらず、複数のスレッド間でスレッドの切り替えが行われています。プロセッサは一度に 1 つのタスクを実行できるため、一度に 1 つのスレッドが実行されます。したがって、現在実行中のスレッドの参照を取得します。