C#

[C#]스레드 상태 확인

DevStory 2022. 6. 6.

IsAlive 프로퍼티

IsAlive 프로퍼티는 현재 스레드의 실행 상태를 불리언 값으로 반환합니다. 스레드가 시작되었고 종료되거나 중단되지 않은 경우 true를 반환하고 그렇지 않은 경우 false를 반환합니다.

 

즉, 스레드가 실행 중이면 true, 그렇지 않으면 false입니다.


ThreadState 프로퍼티

ThreadState 프로퍼티를 사용하여 현재 스레드의 실행 상태를 확인할 수 있습니다. 불리언 값을 반환하는 IsAlive 프로퍼티와 달리 ThreadState프로퍼티는 ThreadState 열거형을 반환합니다.

 

따라서, ThreadState를 사용하기 전에 C#의 스레드 생명주기를 이해할 필요가 있습니다.(프로그래밍 언어마다 스레드 생명주기가 다릅니다.)

 

이번 포스팅에서는 간략한 ThreadState의 상태를 소개하며 추후 C#의 스레드 생명주기에 대해 포스팅할 예정입니다.


시작 전

스레드 클래스의 객체가 생성되었으나 시작되지 않은 상태입니다. 즉, Start() 메서드가 호출되지 않은 상태입니다.


준비

Unstarted 상태에서 Runnable 상태로 이동합니다. Runnable 상태는 스레드 객체가 실행 중이거나 실행할 준비가 되어 있음을 의미합니다. 즉, Start() 메서드가 호출되면 Runnable 상태로 이동합니다.


실행 중

Running 상태는 스레드 객체가 실행 중이며, 중단되지 않은 상태입니다.


실행 불가

WaitSleepJoin: Wait(), Sleep(), Join() 메서드가 호출되면 WaitSleepJoin 상태로 이동합니다.

Suspend: Suspend() 메서드가 호출되면 Suspend 상태로 이동합니다.


작업 완료

Aborted 상태는 AbortRequested 상태를 포함하며 스레드가 비활성 상태지만, 완전히 중지되지는 않았습니다.


IsAlive 프로퍼티 예제

다음 예제는 스레드 객체의 Start() 메서드 호출 전, Start() 메서드 호출 후 IsAlive 프로퍼티의 값을 확인합니다.

class Program
{
  public static void PrintName()
  {
    Console.WriteLine("PrintName() 메서드 호출");
  }
  
  static void Main(string[] args)
  {
    Thread thread = new Thread(PrintName);
    Console.WriteLine("Start() 메서드 호출 전");
    Console.WriteLine("thread 객체의 IsAlive: " + thread.IsAlive + "\n");

    Console.WriteLine("Start() 메서드 호출");
    thread.Start();
    Console.WriteLine("thread 객체의 IsAlive: " + thread.IsAlive + "\n");

    // PrintName() 메서드 호출 후 IsAlive 값 확인하기 위해 Sleep() 설정
    Thread.Sleep(1000);
    Console.WriteLine("thread 객체의 IsAlive: " + thread.IsAlive);
  }
}

실행 결과

Start() 메서드 호출 전
thread 객체의 IsAlive: False

Start() 메서드 호출
thread 객체의 IsAlive: True

PrintName() 메서드 호출
thread 객체의 IsAlive: False

ThreadState 프로퍼티 예제

다음 예제는 ThreadState 프로퍼티로 스레드 객체의 상태를 확인합니다.

class Program
{
  public static void PrintName()
  {
    Console.WriteLine("PrintName() 메서드 호출");
  }
  
  static void Main(string[] args)
  {
    Thread thread = new Thread(PrintName);
    Console.WriteLine("Start() 메서드 호출 전");
    Console.WriteLine("thread 객체의 ThreadState: " + thread.ThreadState + "\n");

    Console.WriteLine("Start() 메서드 호출");
    thread.Start();
    Console.WriteLine("thread 객체의 ThreadState: " + thread.ThreadState + "\n");

    // PrintName() 메서드 호출 후 IsAlive 값 확인하기 위해 Sleep() 설정
    Thread.Sleep(1000);
    Console.WriteLine("thread 객체의 ThreadState: " + thread.ThreadState);
  }
}

실행 결과

Start() 메서드 호출 전
thread 객체의 ThreadState: Unstarted

Start() 메서드 호출
thread 객체의 ThreadState: Running

PrintName() 메서드 호출
thread 객체의 ThreadState: Stopped

Start() 메서드 이전에는 Unstarted 상태이며, Start() 메서드 호출 후 Running 상태로 이동합니다. PrintName() 메서드가 종료되면 스레드 객체는 Stopped 상태로 이동합니다.


정리

  • IsAlive 프로퍼티는 현재 스레드 객체의 실행 상태를 불리언 값으로 나타냅니다.
  • ThreadState 프로퍼티는 IsAlive 프로퍼티에 비해 구체적인 스레드 상태를 나타냅니다.
반응형

댓글