관리되는 스레드 상태
업데이트: 2007년 11월
Thread.ThreadState 속성은 스레드의 현재 상태를 표시하는 비트 마스크를 제공합니다. 스레드는 항상 ThreadState 열거형의 가능한 상태 중 하나 이상의 상태에 속하며 동시에 여러 상태를 가질 수도 있습니다.
중요: |
---|
일부 디버깅 시나리오에서만 스레드 상태가 중요합니다. 스레드 작업을 동기화하려고 코드에서 스레드 상태를 사용해서는 안 됩니다. |
관리되는 스레드를 만들면 Unstarted 상태가 됩니다. 운영 체제에서 시작된 상태로 스레드가 이동되기 전까지 스레드는 Unstarted 상태에 있습니다. Start를 호출하면 운영 체제에서 스레드가 시작될 수 있음을 알게 되지만 스레드의 상태를 변경하지 않습니다.
관리되는 환경에 들어간 관리되지 않는 스레드는 이미 시작된 상태에 있습니다. 일단 시작된 상태가 되면 스레드의 상태를 변경할 수 있는 여러 작업이 있습니다. 다음 표에서는 상태를 변경시키는 작업과 변경된 상태를 보여 줍니다.
작업 |
변경된 상태 |
---|---|
다른 스레드가 Thread.Start를 호출합니다. |
변경 안 됨 |
스레드가 Thread.Start에 응답하여 실행을 시작합니다. |
|
스레드가 Thread.Sleep을 호출합니다. |
|
스레드가 다른 개체의 Monitor.Wait를 호출합니다. |
|
스레드가 다른 스레드의 Thread.Join을 호출합니다. |
|
다른 스레드가 Thread.Suspend를 호출합니다. |
|
스레드가 Thread.Suspend 요청에 응답합니다. |
|
다른 스레드가 Thread.Resume을 호출합니다. |
|
다른 스레드가 Thread.Suspend를 호출합니다. |
|
다른 스레드가 Thread.Abort를 호출합니다. |
|
스레드가 Thread.Abort에 응답합니다. |
Running상태의 값은 0이므로 비트 테스트를 수행하여 이 상태를 확인할 수는 없습니다. 그 대신 의사(pseudo) 코드에서 다음 테스트를 사용할 수 있습니다.
if ((state & (Unstarted | Stopped)) == 0) // implies Running
스레드는 특정 시점에서 두 개 이상의 상태를 가질 수 있습니다. 예를 들어, 스레드가 Monitor.Wait 호출에서 중단되고 다른 스레드가 해당 스레드에서 Abort를 호출하면 이 스레드는 WaitSleepJoin과 AbortRequested 상태를 모두 갖게 됩니다. 이 경우 Wait 호출에서 스레드가 반환되거나 중단되는 즉시 ThreadAbortException을 받게 됩니다.
Start를 호출한 결과 스레드가 Unstarted 상태를 벗어나면 Unstarted 상태로 다시 돌아갈 수 없으며, Stopped 상태에 있는 스레드는 이 상태를 벗어날 수 없습니다.