マネージ スレッドの状態
更新 : 2007 年 11 月
プロパティ Thread.ThreadState には、スレッドの現在の状態を示すビット マスクが用意されています。スレッドは、ThreadState に含まれる状態のうち、常に少なくとも 1 つの状態となり、同時に複数の状態になることもあります。
重要 : |
---|
スレッドの状態が必要になるのは、いくつかのデバッグ シナリオでだけです。コード内で、スレッドの動作を同期化する目的でスレッドの状態を使用しないでください。 |
マネージ スレッドを作成すると、そのスレッドは Unstarted 状態になります。スレッドは、オペレーティング システムによって開始状態に移動されるまで、Unstarted 状態のままです。Start を呼び出すと、スレッドを開始できることをオペレーティング システムに通知できますが、スレッドの状態は変更しません。
マネージ環境に入ってくるアンマネージ スレッドは、既に開始状態になっています。開始状態になると、さまざまなアクションが原因でスレッドが状態を変更する場合があります。状態が変更される原因となるアクションと、対応する新しい状態を次の表に示します。
アクション |
変更後の新しい状態 |
---|---|
他のスレッドが Thread.Start を呼び出します。 |
Unchanged |
スレッドが Thread.Start に応答して実行を開始します。 |
|
スレッドが Thread.Sleep を呼び出します。 |
|
スレッドが別のオブジェクトで Monitor.Wait を呼び出します。 |
|
スレッドが別のオブジェクトで Thread.Join を呼び出します。 |
|
他のスレッドが Thread.Suspend を呼び出します。 |
|
スレッドが Thread.Suspend 要求に応答します。 |
|
他のスレッドが Thread.Resume を呼び出します。 |
|
他のスレッドが Thread.Suspend を呼び出します。 |
|
他のスレッドが Thread.Abort を呼び出します。 |
|
スレッドが Thread.Abort に応答します。 |
Running 状態の値は 0 のため、ビット テストを実行しても、この状態を探索できません。代わりに、擬似コードによる次のテストを実行できます。
if ((state & (Unstarted | Stopped)) == 0) // implies Running
スレッドは、任意の時点に複数の状態にあることがよくあります。たとえば、Monitor.Wait の呼び出しによってスレッドがブロックされ、別のスレッドが同じスレッドで Abort を呼び出した場合、スレッドは同時に WaitSleepJoin 状態と AbortRequested 状態になります。この場合、スレッドは、Wait への呼び出しから戻るか、または中断されるとすぐに ThreadAbortException を受け取ります。
スレッドは、Start への呼び出しによって一度 Unstarted 状態から出ると、Unstarted 状態に戻ることはできません。また、スレッドは Stopped 状態から出ることはできません。