C#에서 스레드(Thread)는 경량 프로세스(lightweight process)라고 불립니다. 각 스레드는 프로그램 내에서 고유한 제어 흐름을 정의하며, 여러 작업을 동시에 처리할 수 있게 해주는 핵심 요소입니다.
스레드의 수명 주기는 System.Threading.Thread 클래스의 객체가 생성되는 시점에 시작되고, 해당 스레드가 종료되거나 실행을 완료하는 시점에 끝납니다.
그렇다면 스레드는 생성부터 소멸까지 어떤 상태들을 거치게 될까요? 아래에서 하나씩 살펴보겠습니다.
1. 시작되지 않은 상태 (Unstarted State)
스레드 인스턴스가 생성되었지만 아직 Start() 메서드가 호출되지 않은 상태입니다. 이 단계에서는 스레드 객체만 존재할 뿐, 실제로 실행될 준비는 되어 있지 않습니다.
2. 실행 준비 상태 (Ready State)
스레드가 실행될 준비를 마치고 CPU 점유(CPU cycle)를 기다리고 있는 상태입니다. 운영체제의 스레드 스케줄러가 이 스레드에 프로세서를 할당하면 곧바로 실행됩니다.
3. 실행 불가능한 상태 (Not Runnable State)
스레드가 다음과 같은 이유로 실행될 수 없는 상태입니다.
Sleep()메서드가 호출된 경우 — 일정 시간 동안 스레드가 일시 중지됩니다.Wait()메서드가 호출된 경우 — 다른 스레드의 신호(락 해제 등)를 기다립니다.- I/O 작업으로 인해 차단(Blocked)된 경우 — 파일 읽기/쓰기나 네트워크 통신 등이 완료될 때까지 대기합니다.
이러한 조건이 해제되면 스레드는 다시 실행 준비 상태로 돌아갑니다.
4. 종료된 상태 (Dead State)
스레드가 실행을 모두 완료했거나, 외부에서 강제로 중단(Abort)된 상태입니다. 한 번 종료된 스레드는 다시 시작할 수 없으며, 필요하다면 새로운 스레드 인스턴스를 생성해야 합니다.
정리
C# 스레드는 생성 → 시작되지 않음(Unstarted) → 실행 준비(Ready) → 실행/대기(Not Runnable) → 종료(Dead)의 흐름으로 수명 주기를 가집니다. 각 상태 전환을 정확히 이해하면 데드락 방지, 자원 관리, 안정적인 멀티스레딩 프로그래밍에 큰 도움이 됩니다.