Java には、初期 (NEW)、実行中 (RUNNABLE)、ブロック済み (BLOCKED)、待機中 (WAITING)、タイムアウト待機中 (TIMED_WAITING)、および終了済み (TERMINATED) の 6 つのスレッド状態があります。 new キーワードを使用して新しいスレッドを作成しますが、start() メソッドは呼び出されません。スレッドは新しい状態にあります。ブロックされた状態は、スレッドがモニター ロックを待機しており、その状態にトラップされていることを示します。待機状態に入ったスレッドは、他のスレッドが何らかの特定のアクション (通知または割り込み) を決定するまで待つ必要があります。
#このチュートリアルの動作環境: Windows7 システム、Java8 バージョン、Dell G3 コンピューター。
Java のスレッドのステータスは 6: に分かれています。 1.
Initial (NEW): 新しいスレッド オブジェクトが作成されますが、start() メソッドはまだ呼び出されていません。 2. 実行 (RUNNABLE)
: Java スレッドでは、準備完了と実行中の 2 つの状態を一般に「実行中」と呼びます。 スレッド オブジェクトが作成された後、他のスレッド (メイン スレッドなど) がオブジェクトの start() メソッドを呼び出します。この状態のスレッドは、実行可能なスレッド プールに配置され、スレッド スケジューリングによって選択され、CPU の使用権を取得するのを待っており、この時点では準備完了状態になります。準備完了状態のスレッドは、CPU タイム スライスを取得した後に実行されます。 3.
ブロック済み (BLOCKED)
: スレッドがロック内でブロックされていることを示します。 4. Waiting(WAITING)
: この状態に入ったスレッドは、他のスレッドが特定のアクション (通知または中断) を行うのを待つ必要があります。 5. タイムアウト待機中 (TIMED_WAITING)
: この状態は WAITING とは異なり、指定された時間が経過すると自動的に戻ることができます。 6.
TERMINATED(TERMINATED): スレッドが実行を完了したことを示します。 これら 6 つの状態は、Thread クラスの State 列挙体で定義されており、1 対 1 に対応するソース コードを表示できます。
1. スレッド状態図
2. 状態の詳細説明
1. 初期状態 (NEW)状態になります。
状態になります。
状態。
状態になります。
状態に入ります。
4. 待機中
(待機中)5. タイムアウト待機
(TIMED_WAITING)##スレッド 1 はオブジェクト A のロックを取得し、オブジェクト A を使用しています。
スレッド 1 は、オブジェクト A の wait() メソッドを呼び出します。
スレッド 1 はオブジェクト A のロックを解放し、すぐに待機キューに入ります。
ロック プール内のオブジェクトは、オブジェクト A のロックをめぐって競合します。
スレッド 5 はオブジェクト A のロックを取得し、同期ブロックに入り、オブジェクト A を使用します。
スレッド 5 は、オブジェクト A の NoticeAll() メソッドを呼び出し、すべてのスレッドをウェイクアップし、すべてのスレッドが同期キューに入ります。スレッド 5 がオブジェクト A の notify() メソッドを呼び出すと、スレッドが起動されますが、誰が起動されるかは不明で、起動されたスレッドは同期キューに入ります。
同期された notificationAll() メソッドが終了し、スレッド 5 がオブジェクト A のロックを解放します。
同期キュー内のスレッドはオブジェクト ロックをめぐって競合しますが、スレッド 1 がいつオブジェクト ロックを取得できるかは不明です。
Thread.sleep(long millis)、このメソッドは現在のスレッドによって呼び出される必要があります。現在のスレッドは TIMED_WAITING 状態に入りますが、オブジェクト ロックは解放されません。ミリ秒後、スレッドは自動的に起動し、準備完了状態になります。機能: 他のスレッドに実行の機会を与える最良の方法。
Thread.yield()、現在のスレッドはこのメソッドを呼び出す必要があります。現在のスレッドは、取得した CPU タイム スライスを放棄しますが、ロック リソースを解放せず、実行中のスレッドから変更します。 OS はスレッドを再度選択します。機能: 同じ優先度のスレッドを順番に実行しますが、順番に実行されるという保証はありません。実際には、譲歩スレッドはスレッド スケジューラによって再度選択される可能性があるため、yield() が譲歩の目的を達成するという保証はありません。 Thread.yield() はブロッキングを引き起こしません。このメソッドは、ユーザーが一時停止する時間を指定できないことを除いて、sleep() に似ています。
thread.join()/thread.join(long millis)、現在のスレッドは他のスレッド t の join メソッドを呼び出し、現在のスレッドは WAITING/# に入ります。 ##TIMED_WAITING 状態 、現在のスレッドはすでに保持されているオブジェクト ロックを解放しません。スレッド t が実行を完了するか、ミリ秒時間が経過すると、現在のスレッドは通常 RUNNABLE 状態になり、BLOCKED 状態になることもあります (結合は待機に基づいて実装されるため)。
プログラミング教育をご覧ください。 !
以上がJavaにはいくつかのスレッド状態がありますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。