본문 바로가기
C#/쓰레드

스레드_스레드 상태 조사_thread state

by 공부봇 2025. 1. 6.
반응형

C# 스레드 상태 조사 강좌

C#에서 스레드 상태를 조사하려면 ThreadState 속성을 사용합니다. ThreadState는 스레드의 현재 상태를 나타내는 열거형으로, 여러 상태 값을 포함합니다. 이 강좌에서는 ThreadState를 이해하고, 예제 코드를 통해 다양한 상태를 확인해 보겠습니다.


스레드 상태의 주요 값

ThreadState는 다음과 같은 주요 상태 값을 포함합니다.

  • Unstarted: 스레드가 생성되었지만 아직 시작되지 않은 상태.
  • Running: 스레드가 실행 중인 상태.
  • WaitSleepJoin: 스레드가 Sleep, Join 또는 다른 대기 상태에 있는 경우.
  • Stopped: 스레드가 작업을 완료하고 종료된 상태.
  • Aborted: 스레드가 비정상적으로 종료된 상태(예: Abort 호출로 인해).

예제 코드: 스레드 상태 조사

아래 코드를 참조하여 스레드의 상태를 확인할 수 있습니다. 각 상태가 출력되는 시점을 살펴보겠습니다.

using System;
using System.Threading;

namespace ThreadStateExample
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Starting program...");

            Thread t1 = new Thread(PrintNumbersWithStatus);
            Thread t2 = new Thread(DoNothing);

            Console.WriteLine($"t1 상태(초기): {t1.ThreadState}");

            t2.Start();
            t1.Start();

            for (int i = 1; i < 30; i++)
            {
                Console.WriteLine($"t1 상태(루프 {i}): {t1.ThreadState}");
            }

            Thread.Sleep(TimeSpan.FromSeconds(6));
            t1.Abort();

            Console.WriteLine("A thread has been aborted.");
            Console.WriteLine($"t1 상태(Abort 호출 후): {t1.ThreadState}");
            Console.WriteLine($"t2 상태: {t2.ThreadState}");
        }

        static void DoNothing()
        {
            Thread.Sleep(TimeSpan.FromSeconds(2));
        }

        static void PrintNumbersWithStatus()
        {
            Console.WriteLine("Starting...");
            Console.WriteLine($"현재 상태: {Thread.CurrentThread.ThreadState}");

            for (int i = 1; i < 10; i++)
            {
                Thread.Sleep(TimeSpan.FromSeconds(1));
                Console.WriteLine(i);
            }
        }
    }
}

결과 및 해설

  1. 초기 상태 (Unstarted)
    • Thread t1과 t2는 생성되었지만 Start 메서드를 호출하지 않았기 때문에 Unstarted 상태입니다.
    • 출력:
      t1 상태(초기): Unstarted
      
  2. 실행 중 (Running)
    • Start() 메서드 호출로 스레드가 실행 상태로 전환됩니다.
    • 출력:
      t1 상태(루프 1): Running
      
  3. 대기 상태 (WaitSleepJoin)
    • t1이 Thread.Sleep 호출로 인해 일시적으로 대기 상태에 들어갑니다.
    • 출력(루프 중간):
      t1 상태(루프 5): WaitSleepJoin
      
  4. Abort 호출 후 (Aborted 또는 Stopped)
    • Abort 메서드 호출로 t1이 중단됩니다.
    • 출력:
      A thread has been aborted.
      t1 상태(Abort 호출 후): Stopped
      
  5. t2 상태
    • t2는 DoNothing 메서드를 실행한 뒤 작업이 끝났기 때문에 Stopped 상태입니다.
    • 출력:
      t2 상태: Stopped
      

스레드 상태의 활용

  • 디버깅: 프로그램 실행 중 스레드의 상태를 확인해 비정상적인 동작을 디버깅할 수 있습니다.
  • 대기 상태 처리: 스레드가 WaitSleepJoin 상태일 때 다른 작업을 수행하거나 적절한 동기화를 적용할 수 있습니다.
  • 종료 확인: 스레드가 Stopped 상태인지 확인하여 리소스를 정리하거나 후속 작업을 실행합니다.

주의사항

  1. Abort 사용 비추천:
    • Thread.Abort는 권장되지 않으며, 플래그를 사용해 스레드를 종료하는 것이 안전합니다.
  2. 스레드 상태는 순간적:
    • 스레드 상태는 매우 빠르게 변할 수 있어, 상태를 읽는 동안 상태가 변경될 가능성이 있습니다.

요약

  • ThreadState를 사용하면 스레드의 현재 상태를 쉽게 확인할 수 있습니다.
  • 다양한 상태(Unstarted, Running, WaitSleepJoin, Stopped)를 적절히 이해하고 활용하는 것이 중요합니다.
  • Abort 대신 플래그를 사용한 안전한 종료 방식을 권장합니다.

추가 질문이 있다면 언제든 물어보세요! 😊

반응형