1.スレッドのライフサイクル-6つの状態
これは、java.lang.Thread.Stateの列挙クラスで定義されています。
public enum State {
NEW,
RUNNABLE,
BLOCKED,
WAITING,
TIMED_WAITING,
TERMINATED;
}
まず、Javaオブジェクトの場合、実行可能としてマークすることしかできないため、準備完了ステータスと実行ステータスを区別しません。実行するタイミングについては、JVMによって制御されるのではなく、OSによってスケジュールされます。 Javaオブジェクトの状態を区別することはできません。私たちは人為的にしか想像も理解もできません。
次に、Thread.Stateの定義によれば、ブロッキング状態は、BLOCKED、WAITING、およびTIMED_WAITINGの3つのタイプに分けられます。
- BLOCKED:互いに競合する複数のスレッドを指します.1つのスレッドがロックオブジェクトを占有している場合、他のスレッドはロックを待機することしかできません。ロックオブジェクトを取得したスレッドのみが実行する機会があります。
- TIMED_WAITING:現在のスレッドがThreadクラスのスリープまたは結合を実行しているとき、Objectクラス、およびLockSupportクラスのparkメソッドを待機し、これらのメソッドが呼び出されると、時刻が設定され、現在のスレッドはTIMED_WAITINGに入ります。時間切れになるまで、または中断されるまで。
- 待機中:現在のスレッドの実行中に、現在のスレッドがObjectクラスの待機、Threadクラスの結合、およびLockSupportクラスのparkメソッドに遭遇した場合、およびこれらのメソッドが指定された時間なしに呼び出された場合、現在のスレッドは、ウェイクアップされるまでWAITING状態になります。
- Objectクラスの待機を通じてWAITING状態に入るには、Objectのnotify / notifyAllによってウェイクアップする必要があります。
- Conditionのawaitを介してWAITING状態に入るには、Conditonのシグナルメソッドを起動する必要があります。
- LockSupportクラスのparkメソッドを介してWAITING状態に入るには、LockSupportクラスのunparkメソッドをウェイクアップする必要があります。
- Threadクラスの結合を介してWAITING状態に入ります。現在のスレッドは、joinメソッドを呼び出すスレッドオブジェクトが終了したときにのみ復元できます。
注:WAITINGまたはTIMED_WAITINGからRunnable状態に復元するときに、現在のスレッドがモニターロックを取得していないことが判明した場合、すぐにBLOCKED状態に切り替わります。