Javaにおけるスレッドのライフサイクル – Javaにおけるスレッドの状態
Javaでスレッドライフサイクルを理解し、スレッド状態について知ることは、スレッドを扱ったりマルチスレッド環境でのプログラミングを行う際に非常に重要です。前のチュートリアルでは、Runnableインターフェースを実装するか、Threadクラスを拡張することでJavaスレッドクラスを作成できますが、Javaスレッドを開始するには、まずThreadオブジェクトを作成し、そのstart()メソッドを呼び出してrun()メソッドをスレッドとして実行する必要があります。
Javaにおけるスレッドのライフサイクル
以下の図は、Javaにおけるスレッドのライフサイクルの異なる状態を示しています。Javaではスレッドを作成し、それを開始することができますが、スレッドの状態がRunnableからRunningへ、そしてBlockedへと変わるかは、OSのスレッドスケジューラの実装に依存しており、Javaは完全な制御を持っていません。
新しい (atarashii)
Javaプログラム内部では、new演算子を使用して新しいThreadオブジェクトを作成すると、スレッドの状態は「New Thread」となります。この時点ではスレッドは生きておらず、Javaプログラミング内部の状態です。
実行可能
Threadオブジェクトのstart()関数を呼び出すと、その状態はRunnableに変更されます。制御はスレッドスケジューラに渡され、実行を完了します。このスレッドを即座に実行するか、実行前にランナブルスレッドプールに保持するかは、OSのスレッドスケジューラの実装に依存します。
走る (はしる)
スレッドが実行されている場合、その状態は実行中に変更されます。スレッドスケジューラは、ランナブルスレッドプールからスレッドを1つ選び、その状態を実行中に変更します。その後、CPUがこのスレッドを実行し始めます。スレッドは、タイムスライシング、run()メソッドの完了、または一部のリソースの待機によって、実行中の状態からランナブル、デッド、またはブロックされた状態に変更することができます。
ブロックされています/待機中
スレッドは、スレッドの終了を待つためにスレッドの結合を使用することもありますし、利用可能なリソースを待つこともあります。例えば、プロデューサーコンシューマー問題やウェイター通知者の実装やIOリソースなどです。その場合、スレッドの状態は「待機中」に変更されます。スレッドの待機状態が終わると、状態は「実行可能」に変更され、再び実行可能なスレッドプールに戻されます。
死んでいる
スレッドの実行が終了すると、その状態はデッドとされて生きていないと見なされます。上記はスレッドの異なる状態です。これらを知り、スレッドがどのように状態を変化させるかを理解することは良いことです。これがJavaにおけるスレッドのライフサイクルに関する情報です。