Javaでのスレッドのライフサイクルとスレッドの状態の理解は、スレッドとマルチスレッド環境のプログラミングを行う際に非常に重要です。前のチュートリアルから、私たちはRunnableインターフェースを実装するか、Threadクラスを拡張することでJavaスレッドクラスを作成することができますが、Javaスレッドを開始するには最初にThreadオブジェクトを作成し、そのstart()メソッドを呼び出してrun()メソッドをスレッドとして実行する必要があります。
Javaでのスレッドのライフサイクル
以下の図は、Javaでのスレッドのライフサイクルの異なる状態を示しています。Javaではスレッドを作成して開始することができますが、スレッドの状態がRunnableからRunningに変わり、Blockedになるかどうかは、OSのスレッドスケジューラの実装に依存しており、Javaはそれに対して完全な制御を持っていません。
新規
新しいThreadオブジェクトをnew演算子を使用して作成すると、スレッドの状態は「New Thread(新しいスレッド)」になります。この時点ではスレッドは動作しておらず、Javaプログラミング内部の状態です。
Runnable(実行可能)
Threadオブジェクトに対してstart()関数を呼び出すと、その状態は「Runnable(実行可能)」に変更されます。制御はスレッドスケジューラに渡され、実行が終了するまで待機します。このスレッドを即座に実行するか、実行する前に実行可能なスレッドプールに保持するかは、OSのスレッドスケジューラの実装に依存します。
Running(実行中)
スレッドが実行中の場合、その状態は「Running(実行中)」に変更されます。スレッドスケジューラは実行可能なスレッドプールから1つのスレッドを選択し、その状態を「Running(実行中)」に変更します。その後、CPUはこのスレッドを実行します。スレッドは、時間スライス、run()メソッドの完了、または一部のリソースの待機に応じて、実行中の状態から実行可能、ブロックされた状態、または終了状態に変更することができます。
Blocked/Waiting(ブロック/待機)
A thread can be waiting for other thread to finish using thread join or it can be waiting for some resources to available. For example producer consumer problem or waiter notifier implementation or IO resources, then it’s state is changed to Waiting. Once the thread wait state is over, it’s state is changed to Runnable and it’s moved back to runnable thread pool.
Dead(終了)
スレッドが実行を終了すると、その状態は「Dead」となり、生きていないと見なされます。上記はスレッドの異なる状態です。それらを知り、スレッドがどのように状態を変化させるかを知ることは良いことです。これでJavaのスレッドライフサイクルに関する説明は終わりです。
Source:
https://www.digitalocean.com/community/tutorials/thread-life-cycle-in-java-thread-states-in-java