C#에서 스레드의 현재 상태를 확인하려면 ThreadState 속성을 사용하면 됩니다. 이 속성은 System.Threading 네임스페이스의 ThreadState 열거형 값을 반환하며, 해당 스레드가 아직 시작되지 않았는지(Unstarted), 실행 중인지(Running) 등을 알려 줍니다. 아래 예제를 통해 자세히 살펴보겠습니다.
예제 1
using System;
using System.Threading;
public class Demo {
public static void Main(){
Thread thread = new Thread(new ThreadStart(demo1));
ThreadPool.QueueUserWorkItem(new WaitCallback(demo2));
Console.WriteLine("Current state of Thread = "+thread.ThreadState);
Console.WriteLine("ManagedThreadId = "+thread.ManagedThreadId);
}
public static void demo1(){
Thread.Sleep(2000);
}
public static void demo2(object stateInfo){
Console.WriteLine("Thread belongs to managed thread pool? = "+Thread.CurrentThread.IsThreadPoolThread);
}
}출력 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
Current state of Thread = Unstarted ManagedThreadId = 3
스레드 객체를 생성한 후 Start() 메서드를 호출하지 않았기 때문에 스레드 상태가 Unstarted로 표시됩니다. ManagedThreadId는 .NET 런타임이 해당 스레드에 부여한 고유 식별자입니다.
예제 2
이번에는 Start() 메서드 호출 전후로 스레드 상태가 어떻게 변하는지 확인해 보겠습니다.
using System;
using System.Threading;
public class Demo {
public static void Main(){
Thread thread = new Thread(new ThreadStart(demo));
Console.WriteLine("ManagedThreadId = "+thread.ManagedThreadId);
Console.WriteLine("Current state of Thread = "+thread.ThreadState);
thread.Start();
Console.WriteLine("Current state of Thread = "+thread.ThreadState);
}
public static void demo(){
Console.WriteLine("Thread belongs to managed thread pool? = "+Thread.CurrentThread.IsThreadPoolThread);
}
}출력 결과
실행 결과는 다음과 같습니다.
ManagedThreadId = 3 Current state of Thread = Unstarted Thread belongs to managed thread pool? = False Current state of Thread = Running
Start() 호출 전에는 상태가 Unstarted였지만, 호출 후에는 Running으로 변경된 것을 확인할 수 있습니다. 또한 new Thread()로 직접 생성한 스레드는 관리되는 스레드 풀(ThreadPool)에 속하지 않기 때문에 IsThreadPoolThread 값이 False로 출력됩니다.
주요 ThreadState 값 정리
- Unstarted: 스레드가 생성되었지만 아직 시작되지 않은 상태
- Running: 스레드가 실행 중인 상태
- WaitSleepJoin: Sleep, Wait, Join 호출 등으로 대기 중인 상태
- Suspended: 일시 중단된 상태
- Stopped: 실행이 완료되어 종료된 상태
- Background: 백그라운드 스레드로 동작 중인 상태