스레드(Thread) 클래스란?
.NET의 System.Threading.Thread 클래스는 멀티스레드 프로그래밍을 구현할 때 사용되는 핵심 클래스로, 스레드의 생성·실행·제어·종료와 관련된 다양한 메서드를 제공합니다.
그중에서도 가장 널리 사용되는 메서드는 Start, Sleep, Join, Abort입니다. 아래 표에서 Thread 클래스가 제공하는 전체 메서드 목록과 각 메서드의 역할을 확인할 수 있습니다.
Thread 클래스 메서드 목록
| 번호 | 메서드 및 설명 |
|---|---|
| 1 | public void Abort() 호출된 스레드에서 ThreadAbortException 예외를 발생시켜 해당 스레드의 종료 절차를 시작합니다. 이 메서드를 호출하면 일반적으로 해당 스레드는 종료됩니다. |
| 2 | public static LocalDataStoreSlot AllocateDataSlot() 모든 스레드에 이름 없는 데이터 슬롯을 할당합니다. 더 나은 성능을 위해서는 이 메서드 대신 ThreadStaticAttribute 특성으로 표시된 필드를 사용하는 것이 좋습니다. |
| 3 | public static LocalDataStoreSlot AllocateNamedDataSlot(string name) 모든 스레드에 지정한 이름의 데이터 슬롯을 할당합니다. 성능 향상을 위해서는 ThreadStaticAttribute 특성이 적용된 필드 사용을 권장합니다. |
| 4 | public static void BeginCriticalRegion() 호스트에게 앞으로 진입하는 코드 영역에서 스레드 중단(Abort)이나 처리되지 않은 예외가 발생할 경우, 같은 애플리케이션 도메인 내의 다른 작업에도 영향을 미칠 수 있음을 알립니다. |
| 5 | public static void BeginThreadAffinity() 관리 코드(managed code)가 현재 물리적 운영체제 스레드의 식별자에 의존하는 명령어를 실행하려고 함을 호스트에게 알립니다. |
| 6 | public static void EndCriticalRegion() 호스트에게 앞으로 진입하는 코드 영역에서는 스레드 중단이나 처리되지 않은 예외의 영향이 현재 작업에 한정됨을 알립니다. |
| 7 | public static void EndThreadAffinity() 관리 코드가 현재 물리적 운영체제 스레드의 식별자에 의존하는 명령어 실행을 마쳤음을 호스트에게 알립니다. |
| 8 | public static void FreeNamedDataSlot(string name) 프로세스 내의 모든 스레드에서 지정한 이름과 슬롯 간의 연결을 해제합니다. 성능 향상을 위해서는 ThreadStaticAttribute 특성이 적용된 필드 사용을 권장합니다. |
| 9 | public static Object GetData(LocalDataStoreSlot slot) 현재 스레드의 현재 도메인 내에서 지정된 슬롯에 저장된 값을 조회합니다. 성능 향상을 위해서는 ThreadStaticAttribute 특성이 적용된 필드 사용을 권장합니다. |
| 10 | public static AppDomain GetDomain() 현재 스레드가 실행 중인 애플리케이션 도메인(AppDomain)을 반환합니다. |
| 11 | public static int GetDomainID() 고유한 애플리케이션 도메인 식별자(ID)를 반환합니다. |
| 12 | public static LocalDataStoreSlot GetNamedDataSlot(string name) 지정한 이름의 데이터 슬롯을 찾아 반환합니다. 성능 향상을 위해서는 ThreadStaticAttribute 특성이 적용된 필드 사용을 권장합니다. |
| 13 | public void Interrupt() WaitSleepJoin 상태에 있는 스레드를 중단(interrupt)합니다. |
| 14 | public void Join() 대상 스레드가 종료될 때까지 호출한 스레드를 차단(blocking)하며, 이때 표준 COM 및 SendMessage 펌핑은 계속 수행됩니다. 이 메서드는 여러 오버로드 형태를 제공합니다. |
| 15 | public static void MemoryBarrier() 메모리 접근을 다음과 같이 동기화합니다. 현재 스레드를 실행 중인 프로세서는 MemoryBarrier 호출 이전의 메모리 접근이 호출 이후의 메모리 접근보다 나중에 실행되도록 명령어를 재정렬할 수 없습니다. |
| 16 | public static void ResetAbort() 현재 스레드에 대해 요청된 Abort를 취소합니다. |
| 17 | public static void SetData(LocalDataStoreSlot slot, Object data) 현재 실행 중인 스레드의 해당 도메인에서 지정된 슬롯에 데이터를 설정합니다. 성능 향상을 위해서는 ThreadStaticAttribute 특성이 적용된 필드 사용을 권장합니다. |
| 18 | public void Start() 스레드의 실행을 시작합니다. |
| 19 | public static void Sleep(int millisecondsTimeout) 지정된 시간(밀리초) 동안 스레드를 일시 정지시킵니다. |
| 20 | public static void SpinWait(int iterations) iterations 매개변수로 지정된 횟수만큼 스레드가 대기하도록 합니다. |
자주 사용되는 핵심 메서드
실무에서 가장 많이 쓰이는 네 가지 메서드는 다음과 같습니다.
Start() – 스레드를 생성하고 실행을 시작합니다.
Sleep() – 지정한 시간 동안 현재 스레드를 일시 정지합니다.
Join() – 다른 스레드의 작업이 끝날 때까지 현재 스레드를 대기시킵니다.
Abort() – 강제로 스레드를 종료시킵니다.
참고 사항
Abort() 메서드는 .NET Framework에서만 지원되며, .NET Core 및 .NET 5 이상에서는 NotSupportedException이 발생합니다. 최신 환경에서는 CancellationToken이나 Task 기반의 안전한 종료 방식을 사용하는 것이 권장됩니다. 또한 데이터 슬롯 관련 메서드보다는 ThreadStaticAttribute 또는 ThreadLocal<T>를 사용하는 것이 성능과 유지보수 측면에서 더 유리합니다.