オペレーティング システム レベルから見ると、通常、どのスレッドにも 5 つの状態 (作成、準備完了、実行中、ブロック、終了) があります。
(1) 新しい状態 (NEW)
コンストラクター メソッドを使用してプログラム内に新しいスレッド (new Thread() など) を作成する場合、スレッドは作成状態にあり、対応するメモリ空間とその他のリソースはすでにありますが、実行はまだ開始されていません。
(2) 準備完了状態 (READ)
スレッドの開始は、新しく作成されたスレッド オブジェクトの start() メソッドを呼び出すことで実現できます。スレッドが開始されると、スレッドは準備完了状態 (実行可能) になります。
スレッドは実行状態にありますが、CPU がまだ割り当てられていないため、スレッド キューに入り、CPU サービスを待つためにキューに入れられます。 。システムが実行するスレッド オブジェクトを選択すると、オブジェクトは待機状態から実行状態に遷移します。システムによって選択されるアクションは「CPU スケジューリング」と呼ばれます。スレッドが CPU を取得すると、実行状態になり、独自の run メソッドが自動的に実行されます。
(3) 実行状態(RUNNING)
準備完了状態のスレッドが呼び出されると実行状態となり、プロセッサリソースを占有します。このとき、スレッドオブジェクトの run() メソッドが自動的に呼び出されます。
(4) ブロック状態 (BLOCKED)
実行中のスレッドは、人為的に中断された場合や、時間のかかる入出力操作を実行する必要がある場合など、特定の特殊な状況下でブロックされます。 CPU から実行され、自身の実行を一時的に中断し、ブロッキング状態に入ります。
実行可能状態で sleep()、suspend()、wait() などのメソッドを使用すると、スレッドがブロックされます。ブロックされた場合、スレッドはキューに入ることができません。ブロックの原因が解消された場合にのみ、スレッドはレディ状態になり、レディキューに戻って待機します。このとき、CPU スケジュールによって選択された後、スレッドは続行されます。元の停止位置から実行します。
注意: ブロッキングが解消されると、実行状態ではなく準備完了状態に戻ります。
(5) 終了状態 (TERMINATED)
スレッドが stop()、destroy()、または run() を呼び出して実行を完了すると、スレッドは終了状態になります。デッド状態のスレッドは実行を継続することができません。
Java のスレッドのライフサイクルは 6 つの状態に分割されます。 Thread クラスには、スレッドの状態を保存および取得するために特に使用されるインスタンス プロパティとインスタンス メソッドがあります。その中で、スレッド Thread インスタンスの状態を保存するために使用されるインスタンス属性は次のとおりです。
// 以整数的形式保存线程的状态 private volatile int threadStatus = 0; // 返回当前线程的状态,一个枚举类型值 public State getState() { return sun.misc.VM.toThreadState(threadStatus); }
Thread.State は、次のような Java スレッドの 6 つの状態を表す 6 つの列挙定数を定義する内部列挙クラスです。 #
public enum State { // 新建状态 NEW, // 运行状态 RUNNABLE, /** * 阻塞状态 * Object.wait */ BLOCKED, /** * 等待状态 * Object.wait * Thread.join * LockSupport.park */ WAITING, /** * 限时等待状态 * Thread.sleep * Object.wait * Thread.join * LockSupport.parkUntil * LockSupport.parkNanos */ TIMED_WAITING, // 终止状态 TERMINATED; }
Thread インスタンスが NEW 状態にある場合、start() メソッドが呼び出されると、スレッドは RUNNABLE 状態に移行します。それにもかかわらず、スレッドの run() メソッドはすぐには同時実行されない可能性があるため、スレッドが CPU タイム スライスを取得した後に同時実行を開始する必要があります。
(3) TERMINATED 状態
RUNNABLE 状態のスレッドが run() メソッドの実行を終了すると、終了状態 TERMINATED になります。もちろん、run() メソッドの実行中に実行時例外が発生し、それが捕捉されなかった場合、run() メソッドは異常終了し、スレッドも TERMINATED になります。
(4) TIMED_WAITING 状態
スレッドは特別な待機状態にあります (正確には、スレッドは時間制限付きの待機状態にあります)。スレッドを時間制限付き待機状態にできる操作には、次のものがあります。
Thread.sleep(int n): 現在のスレッドを時間制限付き待機状態にします。待機時間は n ミリ秒です。
Object.wait(): 時間制限付きでオブジェクトのモニター ロックをプリエンプトします。
Thread.join(): 時間制限のあるスレッドのマージ。
LockSupport.parkNanos(): スレッドを待機させます。時間はナノ秒単位です。
LockSupport.parkUntil(): スレッドを待機させ、時間を柔軟に設定できます。
以上がJava スレッドの 5 つの状態とは何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。