次の方法で共有


マネージ スレッドの状態

更新 : 2007 年 11 月

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

重要 :

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

マネージ スレッドを作成すると、そのスレッドは Unstarted 状態になります。スレッドは、オペレーティング システムによって開始状態に移動されるまで、Unstarted 状態のままです。Start を呼び出すと、スレッドを開始できることをオペレーティング システムに通知できますが、スレッドの状態は変更しません。

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

アクション

変更後の新しい状態

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

Unchanged

スレッドが Thread.Start に応答して実行を開始します。

Running

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

WaitSleepJoin

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

WaitSleepJoin

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

WaitSleepJoin

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

SuspendRequested

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

Suspended

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

Running

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

Running

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

AbortRequested

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

Aborted

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

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

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

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

参照

参照

ThreadAbortException

Thread

ThreadState

その他の技術情報

マネージ スレッド処理