私は作っているゲームのスレッドを使って作業しようとしています。私は非常にですので、正しく理解できない場合があります。私の質問は、Java APIのThreadクラスでcurrentThread()メソッドがどのように機能するかです。 APIは、 "現在実行中のスレッドオブジェクトへの参照を返します"と述べていますが、同時に複数のスレッドが実行されていると理解しています。実行中のスレッドを1つだけ返すことはどのように可能ですか?現在のスレッドメソッドjava
答えて
currentThread
を呼び出すコードは、いずれかのスレッドで実行されますが、すべてではなく、そのスレッドを具体的に取得できます。
それははるかに明確になりますありがとうございました。 – user1427380
コード内の命令が実行されると、特定のスレッド内で実行されます。これは、そのメソッドによって返されたスレッドです。
明らかに、特定のメソッドが複数のスレッドによって実行された場合、実行ごとに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();
}
}
"現在実行中のスレッド"とは、システムスケジューラがコードを実行するためにこのスレッドに時間を与えたことを意味します。
複数のスレッドが同時に実行されておらず、複数のスレッド間でスレッドの切り替えが行われています。プロセッサは一度に1つのタスクを実行できるので、一度に1つのスレッドが実行されます。そこで、現在実行中のスレッドの参照を取得します。
マルチコアマシンは本当に一度に複数のスレッドを実行します。私は大規模なマルチスレッドのプログラム(高度にインタラクティブなスレッドを持つ)を単一のコアマシンで動かし、それを4コアのマシンに移動しました。それは本当の教育でした。 – RalphChapin
"複数のスレッドが_同時に_同時に実行されていません..." – jdv
説明書のリストが紙に印刷されているとします。人が指示を読んで実行します。命令はプログラムです。その人はスレッドです。あなたは紙のコピーをたくさん作って、それを多くの人に渡すことができます。指示が「自分を叩く」のようなものであれば、自分では、その指導書を読んでいる人を指します。同様に、Thread.currentThread()
は、その呼び出しをcurrentThread()
に実行しているスレッドを指します。
シングルスレッドアプリケーションを書くときには、一連の命令のように、前の命令が完了した後に実行される命令を考えることができます(これはおおよその近似ですが、概念的にコンパイラとプロセッサは、これが本当に起こっていた場合)。
複数のスレッドを使用する場合、各スレッドにはそれぞれ独自の一連の命令があります。新しいスレッドが作成されると、エントリポイント(メソッド)が渡され、そこから実行を継続します。各スレッドは、メモリを共有しているため、あるスレッドからの副作用が別のスレッドに影響を与える可能性がありますが、実行中の他のスレッドとは独立しています(別のスレッドに対して1つの命令を実行するだけです)。
実行するコードによっては、あるスレッドのコンテキストで実行する必要があります(アプリケーションが起動するときにオペレーティングシステムによって作成され、実行はMain
メソッドで開始されます)。関数currentThread
が呼び出されると、そのコンテキストの1つになります。
スレッドを作成するときのJavaランタイムは、そのThread
オブジェクトへの参照をスレッドコンテキストに格納し、currentThread
はそこを検索して現在のスレッドを返します。
任意の時点では、実行中のスレッドは1つだけです(ライブ)ので、Thread.currentThread()
は現在実行中のスレッドの詳細を返します。例えば、Thread_name、priority、method_name。
- 1. Javaプロパティファイルの現在のディレクトリ
- 2. Javaの `Lock`が現在のスレッド
- 3. Javaオプション現在の場合取得
- 4. Javaは:現在の作業ディレクトリ
- 5. Javaシステム環境変数現在のユーザ
- 6. Jiraのクイックフィルタは、現在のユーザー現在
- 7. 現在のクライアント
- 8. 現在のソート
- 9. 現在のURL
- 10. 現在のビュー
- 11. ...現在の週
- 12. 現在のモノラルデフォルトガベージコレクタ
- 13. 現在の日付と日付をJavaの現在の値から1年保存します
- 14. C#スレッドメソッドは値を返しますか?
- 15. Java - 現在のJAR内のファイル名のリストを取得
- 16. Oracle Java HotSpot VMのパフォーマンス・オプション(+ UseStringCache、+ UseCompressedStrings、+ OptimizeStringConcat)の現在のステータス
- 17. 地図と私の現在のプロジェクトでのJava
- 18. のJava - リフレクション:取得現在のクラスに属するフィールドのみ
- 19. Javaのファイル名としての現在のタイムスタンプ
- 20. jQueryの現在の
- 21. Javaで、現在の月の日数を取得します
- 22. Javaの現在のディレクトリからファイルを読み取る
- 23. 現在のURLをJavaのセッションに保存するには
- 24. Java Apache FTPClient:私の現在のディレクトリを知る方法
- 25. Javaを搭載したAJAXの現在のコアテクノロジー?
- 26. iOS:現在のTableViewCellの現在のコントロールを指す方法
- 27. 現在のバインディング値
- 28. 現在のRailsユーザ
- 29. リファレンス現在の行
- 30. 現在のページインジケータMVVM
スレッドに関するチュートリアルを読む必要があります。 – Sajmon
私はそれらにgetSelfThread()などの名前を付けておかなければならないと思います。なぜなら、複数のCPUを持つ現在実行中のスレッドが複数ある可能性があるからです。 – goat