본문 바로가기
[2]SW Development Note/[2-2.2].NET CLR

[Thread Book #5] 스레드 상태 조사

by 오늘도 빛나는 너에게 2020. 7. 26.
728x90
[Thread Book #5] 스레드 상태 조사

스레드가 가질 수 있는 상태를 설명하며 스레드가 이제 시작됐는지의 여부나 스레드가 봉쇄 상태인지의 여부에 관한 정보를 얻을때 유용하다.
스레드는 독립적으로 실행되므로 언제든지 상태가 바뀔수 있음에 주목하길 바란다.

class Program
       {
              static void Main(string[] args)
              {
                     Console.WriteLine("Starting program...");
                     Thread t = new Thread(PrintNumbersWithStatus);
                     Thread t2 = new Thread(DoNothing);
                     Console.WriteLine(t.ThreadState.ToString());
                     t2.Start();
                     t.Start();
                     for (int i = 1; i < 30; i++)
                     {
                           Console.WriteLine(t.ThreadState.ToString());
                     }
                     Thread.Sleep(TimeSpan.FromSeconds(6));
                     t.Abort();
                     Console.WriteLine("A thread has been aborted");
                     Console.WriteLine(t.ThreadState.ToString());
                     Console.WriteLine(t2.ThreadState.ToString());
              }
              static void DoNothing()
              {
                     Thread.Sleep(TimeSpan.FromSeconds(2));
              }
              static void PrintNumbersWithStatus()
              {
                     Console.WriteLine("Starting...");
                     Console.WriteLine(Thread.CurrentThread.ThreadState.ToString());
                     for (int i = 1; i < 10; i++)
                     {
                           Thread.Sleep(TimeSpan.FromSeconds(2));
                           Console.WriteLine(i);
                     }
              }
       }

   


다른 두 스레드를 정의한 메인 프로그램이 시작하면 한 스레드는 중단되고,다른 스레드는 성공적으로 실행된다.
C#의 열거형인 스레드 상태는 Thread 객체의 ThreadState 속성에 있다. 첫 번째 스레드는 ThreadState.Unstarted 상태를 갖는다.
그러면 실행중이라고 가정할때 주기를 30번 반복하는 동안에 스레드는 자신의 상태를 ThreadState.Running 에서 ThreadState.WaitSleepJoin으로 바꾼다.
  • 현재 Thread 객체는 Thread.CurrentTherad 정적 속성을 통해 항상 접근할 수 있음에 주목하길 바란다.
만약에 발생하지 않았다면 반복 횟수를 늘리면 된다.그런 후에 첫 번째 스레드를 중단하면 ThreadState.Aborted 상태를 가짐을 지금 볼수 있다.
프로그램이 ThreadState.AbortRequested 상태를 출력하는 것도 역시 가능하며 두 스레드 동기화의 복잡도를 잘 보여준다.
프로그램에서 스레드 중단을 사용하지 말아야함을 명심해야한다. 여기에서만 스레드 상태를 보여줄 뿐이다

끝으로 두 번째 스레드인 T2가 성공적으로 끝났음을 볼수 있으며 지금은 ThreadState.Stopped 상태를 갖는다.
여러 다른 스레드 상태가 있지만, 부분적으로 더 이상 사용되지 않으며 조사했던 것은 어느 정도 유용하지 않다.

출처 : C# 멀티스레드 프로그래밍 -유진 아가포노프 -  




728x90

댓글