オペレーティング システム レベルから見ると、通常、どのスレッドにも 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; }4 つの一般的な状態があります。NEW (新規) 状態、RUNNABLE (実行可能) 状態、TERMINATED (終了) 状態、TIMED_WAITING (時間制限待機) 状態です。 (1) NEW 状態Java ソース コードでは、NEW 状態について次のように説明しています。 正常に作成されたが、start() メソッドの呼び出しによって開始されていないスレッド スレッド インスタンスは、NEW 状態にあります。州。 もちろん、Thread スレッド インスタンスの start() メソッドが呼び出されると、その状態は NEW 状態から RUNNABLE 状態に変わります。これは、スレッドがすぐに CPU タイム スライスを取得し、実行するとすぐに実行されますが、途中で時間がかかります シリーズOSの内部動作です。 (2) RUNNABLE 状態Thread インスタンスの start() メソッドを呼び出した後、スレッドが CPU タイム スライスを取得して次のステップで実行を開始すると、JVM は非同期でスレッドの run() メソッド ビジネス コードを実行します。それでは、 run() メソッドが非同期的に呼び出される前に、JVM は何を行っていたのでしょうか? Java スレッドの Thread インスタンスの start() メソッドが呼び出されると、オペレーティング システムの対応するスレッドは実行状態ではなく準備完了状態になり、Java スレッドはこの準備完了状態になりません。オペレーティング システムのスレッドの準備状態は何ですか? JVM のスレッド状態と、その背後にあるオペレーティング システムのスレッド状態との間の変換関係は、次のように単純化されます。 オペレーティング システムのスレッドが準備完了状態にある場合、それは「」を意味します。すべての準備ができています」 「準備はできています、東風に借りがあるだけです」 つまり、スレッドは実行条件を満たしていますが、まだ実行できません。準備完了状態のスレッドは、システムのスケジューリングを待つ必要があります。システムによって準備完了状態が選択され、CPU タイム スライスを取得すると、スレッドは CPU を占有し始め、スレッドのコードの実行を開始します。オペレーティング システムのスレッドの状態が変化し、実行状態になります。 オペレーティング システムで実行中のスレッドが CPU タイム スライスを使い果たすと、準備完了状態に戻り、次の CPU スケジューリングを待ちます。このように、オペレーティング システムのスレッドは、準備完了状態と実行状態の間でシステムによって繰り返しスケジュールされ、スレッドのコード ロジックの実行が完了するか、スレッドが異常終了するまで、この状況が継続します。この時点で、スレッドのオペレーティング システムの状態は再び変化し、スレッドの最終状態である TERMINATED 状態に入ります。 準備完了状態と実行状態はどちらもオペレーティング システムのスレッド状態です。 Java 言語では、これら 2 つの状態は細分化されず、同じ状態 (RUNNABLE 状態) にマージされます。したがって、Thread.State 列挙クラスでは、スレッドの準備完了状態と実行状態は定義されず、RUNNABLE 状態のみが定義されます。ここが、Java スレッドの状態がオペレーティング システムのスレッド状態と異なる点です。
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 サイトの他の関連記事を参照してください。