私は作っているゲームのスレッドを使って作業しようとしています。私は非常にですので、正しく理解できない場合があります。私の質問は、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. スレッドメソッド
- 2. JavaのThiledMap現在のスレッド
- 3. Javaプロパティファイルの現在のディレクトリ
- 4. Java - requestFocus現在の要素
- 5. Javaの `Lock`が現在のスレッド
- 6. Javaシステム環境変数現在のユーザ
- 7. Javaオプション現在の場合取得
- 8. Javaは:現在の作業ディレクトリ
- 9. Javaスクリプト現在の地理位置
- 10. Jiraのクイックフィルタは、現在のユーザー現在
- 11. ヒューゴエラー - 現在のテーマは、現在のバージョン
- 12. C#スレッドメソッドは値を返しますか?
- 13. スレッドメソッドをスレッドセーフにするには?
- 14. 現在のメッセージの前にすべてのメッセージとAckの現在のメッセージをナックします(rabbitmq、java)
- 15. 現在の日付と日付をJavaの現在の値から1年保存します
- 16. 現在のURL
- 17. 現在の行
- 18. 現在のフォルダ
- 19. 現在のモノラルデフォルトガベージコレクタ
- 20. 現在のソート
- 21. 現在のビュー
- 22. 現在のUserControl.Resources
- 23. 現在のユーザージャンゴ
- 24. ...現在の週
- 25. 現在のクライアント
- 26. 現在のタイムスタンプ
- 27. 現在
- 28. 現在
- 29. のJava - 現在の時刻(GMT)の分で0を追加
- 30. のJava - リフレクション:取得現在のクラスに属するフィールドのみ
スレッドに関するチュートリアルを読む必要があります。 – Sajmon
私はそれらにgetSelfThread()などの名前を付けておかなければならないと思います。なぜなら、複数のCPUを持つ現在実行中のスレッドが複数ある可能性があるからです。 – goat