マネージ スレッドの状態

更新 : 2011 年 5 月

プロパティ Thread.ThreadState には、スレッドの現在の状態を示すビット マスクが用意されています。 スレッドは、ThreadState に含まれる状態のうち、常に少なくとも 1 つの状態となり、同時に複数の状態になることもあります。

重要 :重要

スレッドの状態が必要になるのは、いくつかのデバッグ シナリオでだけです。コード内で、スレッドの動作を同期化する目的でスレッドの状態を使用しないでください。

マネージ スレッドを作成すると、そのスレッドは ThreadState.Unstarted 状態になります。 オペレーティング システムでスレッドの実行をスケジュールできるようにスレッドを Running 状態にする Thread.Start メソッドを呼び出すまで、スレッドは Unstarted 状態のままです。

マネージ環境に入ってくるアンマネージ スレッドは、既に開始済みです。 スレッドが開始されると、さまざまなアクションが原因でスレッドが状態を変更する場合があります。 状態が変更される原因となるアクションと、対応する新しい状態を次の表に示します。

アクション

変更後の新しい状態

Thread クラスのコンストラクターを呼び出します。

Unstarted

別のスレッドが新しいスレッドに対して Thread.Start メソッドを呼び出し、その呼び出しから制御が戻ります。

メモメモ
新しいスレッドが Running 状態になるまで、Start メソッドから制御は戻りません。Start の呼び出し中にどの時点でこの状態になるか確認する方法はありません。

Running

スレッドが Thread.Sleep を呼び出します。

WaitSleepJoin

スレッドが別のオブジェクトで Monitor.Wait を呼び出します。

WaitSleepJoin

スレッドが他のスレッドで Thread.Join を呼び出します。

WaitSleepJoin

他のスレッドが Thread.Suspend を呼び出します。

SuspendRequested

スレッドが Thread.Suspend 要求に応答します。

Suspended

他のスレッドが Thread.Resume を呼び出します。

Running

他のスレッドが Thread.Abort を呼び出します。

AbortRequested

スレッドが Thread.Abort に応答します。

Aborted の後、Stopped

Running 状態の値は 0 のため、ビット テストを実行しても、この状態を探索できません。 代わりに、擬似コードによる次のテストを実行できます。

if ((state & (Unstarted | Stopped)) == 0)   // implies Running   

スレッドは、任意の時点に複数の状態にあることがよくあります。 たとえば、Monitor.Wait の呼び出しによってスレッドがブロックされ、別のスレッドが同じスレッドで Abort を呼び出した場合、スレッドは同時に WaitSleepJoin 状態と AbortRequested 状態になります。 この場合、スレッドは、Wait への呼び出しから戻るか、または中断されるとすぐに ThreadAbortException を受け取ります。

スレッドは、Start への呼び出しによって一度 Unstarted 状態から出ると、Unstarted 状態に戻ることはできません。 また、スレッドは Stopped 状態から出ることはできません。

参照

参照

ThreadAbortException

Thread

ThreadState

その他の技術情報

マネージ スレッド処理

履歴の変更

日付

履歴

理由

2011 年 5 月

Thread.Start メソッドと Running 状態の関係をより明確にしました。

カスタマー フィードバック

2011 年 3 月

Thread.Start メソッドと Running 状態の関係を明確にしました。

コンテンツ バグ修正