start()
スレッドについて勉強していて、Java スレッドのメソッドが実際に何をするのか混乱しています。
私の現在の理解では、 start メソッドはスレッドの実行をすぐに開始するのではなく、スレッドスケジューラによって実行のために選択されるのを待っているスレッドのプールに移動します。
これは正しいです?メソッドが実際に何をするかについての良いリソースを見つけることができないようです。
start()
スレッドについて勉強していて、Java スレッドのメソッドが実際に何をするのか混乱しています。
私の現在の理解では、 start メソッドはスレッドの実行をすぐに開始するのではなく、スレッドスケジューラによって実行のために選択されるのを待っているスレッドのプールに移動します。
これは正しいです?メソッドが実際に何をするかについての良いリソースを見つけることができないようです。
正確には、 への呼び出しstart()
が実行されると、 への呼び出しをスケジュールするだけrun()
です。スレッドがいつ実質的に起動されるか、またいつ実質的に停止されるかを判断することはできません。
詳細については、Oracle の Web サイトの Java Doc を参照してください。
始める
public void start() このスレッドに実行を開始させます。Java 仮想マシンは、このスレッドの run メソッドを呼び出します。その結果、2 つのスレッドが同時に実行されます。現在のスレッド (start メソッドの呼び出しから戻るスレッド) と、もう一方のスレッド (その run メソッドを実行するスレッド) です。
例外: IllegalThreadStateException - スレッドがすでに開始されている場合。関連項目: run()、stop()
Threads と ThreadPools を混同しています
スレッドは「実行単位」です。別のスレッドで実行されるコードは、呼び出し時にメイン プログラムと並行して実行されます。start()
ThreadPools は、スレッドの上に構築されたメカニズムであり、ThreadPool キューに送信したタスクを実行するスレッドのグループを作成できます。
はい、これは正しいです。このスレッドがいつ実行されるかはわかりませんが、実行がスケジュールされていることは確かです。次の写真を見てください。スレッドのライフサイクルについて説明しています: http://cs.fit.edu/~ryan/java/language/thread.gif
start
はすぐに新しいスレッドを開始しますが、スレッドの性質上、そのスレッド内のコード行が実際にいつ実行されるかは保証されません。プールの概念には、ユーザーが要求したタスク間で再利用されるリソースが含まれるため、このコンテキストで「スレッド プール」という用語を使用することは適切ではありません。Thread
インスタンスはメソッドの 1 回の呼び出しに固定されており、run
その後スレッドは終了します。
スレッド スケジューラはネイティブ OS レベルのコンポーネントであり、JVM の直接の制御下にはありません。
呼び出すThread.start
と、スレッドを開始するために JVM に特別な指示が行われ、JVM がそのライフサイクルを処理します。