C#에서 어떤 스레드가 지금 실행 중인지, 즉 활성(alive) 상태인지 확인하려면 Thread.IsAlive 속성을 사용하면 됩니다. 이 속성은 스레드가 이미 시작되었고 아직 종료되거나 중단되지 않았다면 true를, 그렇지 않다면 false를 반환합니다.
예제 1 – IsAlive와 주요 스레드 속성 확인하기
다음 예제는 IsAlive뿐만 아니라 스레드의 현재 상태, 고유 식별자, 백그라운드 스레드 여부까지 한 번에 출력합니다.
using System;
using System.Threading;
public class Demo {
public static void Main() {
Thread thread = new Thread(new ThreadStart(demo1));
thread = Thread.CurrentThread;
Console.WriteLine("스레드가 활성 상태입니까? = " + thread.IsAlive);
ThreadPool.QueueUserWorkItem(new WaitCallback(demo2));
Console.WriteLine("스레드의 현재 상태 = " + thread.ThreadState);
Console.WriteLine("ManagedThreadId = " + thread.ManagedThreadId);
thread.IsBackground = true;
Console.WriteLine("백그라운드 스레드입니까? = " + thread.IsBackground);
}
public static void demo1() {
Thread.Sleep(2000);
}
public static void demo2(object stateInfo) {
Console.WriteLine("관리되는 스레드 풀 소속입니까? = " + Thread.CurrentThread.IsThreadPoolThread);
}
}
출력 결과
스레드가 활성 상태입니까? = True 스레드의 현재 상태 = Running ManagedThreadId = 775 백그라운드 스레드입니까? = True 관리되는 스레드 풀 소속입니까? = True
※ ManagedThreadId 값은 프로그램을 실행할 때마다 달라질 수 있습니다.
코드에서 사용된 주요 속성 정리
- IsAlive – 스레드가 시작된 후 아직 종료(Stopped)되거나 중단(Aborted)되지 않았으면 true를 반환합니다.
- ThreadState – Unstarted, Running, WaitSleepJoin, Stopped 등 스레드의 현재 실행 상태를 나타냅니다.
- ManagedThreadId – 관리되는 런타임(.NET CLR) 내에서 각 스레드에 고유하게 부여되는 식별자입니다.
- IsBackground – 백그라운드 스레드이면 true입니다. 백그라운드 스레드는 모든 포그라운드 스레드가 종료되면 프로세스와 함께 자동으로 중단됩니다.
- IsThreadPoolThread – 해당 스레드가 .NET 관리 스레드 풀에 속해 있으면 true를 반환합니다.
예제 2 – 새로 시작한 스레드의 활성 여부 확인
이번에는 new Thread()로 직접 생성한 스레드를 시작한 뒤 IsAlive를 확인하고, 해당 스레드가 스레드 풀에 속하는지도 함께 살펴보겠습니다.
using System;
using System.Threading;
public class Demo {
public static void Main() {
Thread thread = new Thread(new ThreadStart(demo));
thread.Start();
Console.WriteLine("스레드가 활성 상태입니까? " + thread.IsAlive);
}
public static void demo() {
Console.WriteLine("관리되는 스레드 풀 소속입니까? = " + Thread.CurrentThread.IsThreadPoolThread);
}
}
출력 결과
스레드가 활성 상태입니까? True 관리되는 스레드 풀 소속입니까? = False
직접 생성해 시작한 스레드는 스레드 풀이 아니기 때문에 IsThreadPoolThread가 False로 출력됩니다. 반면 예제 1에서 ThreadPool.QueueUserWorkItem으로 실행한 작업은 스레드 풀 스레드에서 동작하므로 True가 출력됩니다.
정리 및 참고 사항
스레드의 활성 여부를 확인하는 가장 간단한 방법은 IsAlive 속성을 사용하는 것입니다. 다만 IsAlive를 확인하는 시점과 실제로 그 결과를 활용하는 시점 사이에 스레드 상태가 변경될 수 있으므로(경합 조건), 스레드가 끝날 때까지 기다려야 한다면 thread.Join() 메서드를 사용하는 것이 더 안전합니다.