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