-
Thread? 개념부터 짚자개념 Self Study📝/C# 2024. 9. 11. 15:44
1. 개요
Thread라는 것에 대해서 IT종사자들은 어느정도는 으레 짐작으로 알고있다고 생각한다. 그렇지만 자세한 개념에 대해서 알고있지는 않다고 판단이 되어 개념부터 한번 짚고 넘어가보자
2. Thread 란?
Thread는 어떠한 프로그램 내에서 특히 프로세스 내에서 실행되는 흐름의 단위를 말한다. 일반적으로 한 프로그램은 하나의 Thread를 가지고 있지만, 프로그램 환경에 따라 둘 이상의 Thread를 동시에 실행할수 있다. 이러한 실행 방식을 Munti Thread라고 한다.
Multi Process와 Multi Thread는 양쪽 모두 여러 흐름이 동시에 진행되는 공통점이 있다. Process와 Thread에 대한 차이는 process들은 별개의 메모리를 차지하는 것과 다르게 Thread는 process내의 메모리를 공유해 사용할 수 있다.
3. Multi Thread와 Single Thread
Single Thread는 Single -threaded Process내에서 하나의 Thread만 동작하는 것을 확인 할 수 있으며,
Multi Thread는 Multi-threaded Process내에서 여러개의 Thread가 동작하는 것을 확인 할 수 있다.
Single Thread Multi Thread 장점 성능적인 부분에서 뛰어나며 관리가 쉽다 동시에 작업을 처리할 수 있으며, 처리속도가 빠르다. 단점 작업 처리시간이 오래걸리거나 무거운 작업 처리시 시스템 성능에 영향을 초래한다. Thread간의 동기화 및 추가적인 관리가 필요하다. 4. Thread의 상태
- Unstarted: Thread 객체를 생성한 후 Thread.Start() 메서드가 호출 되기 전의 상태
- Running: Thread가 시작하여 동작중인 상태
- Unstared 상태의 Thread를 Thread.Start() 메소드를 통해 해당 상태로 변환
- Suspend: Thread의 일시중단 상태
- Thread.Suspend()메서드를 통해 해당 상태로 만들수 있으며, Suspended 상태인 Thread는 Thread.Resume() 메서드를 통해 다시 Running한다.
- WaitSleepJoin: Thread가 Block된 상태
- Thread.Sleep(), Thread.Join() 메서드를 호출하면 해당 상태가 된다.
- Aborted: Thread가 취소된 상태
- Thread.Abort()메소드를 호출하면 이 상태가 된다. Aborted상태가 된 Thread는 다시 Stopped상태로 전환되어 완전히 중지된다.
- Stopped: 중지된 Thread의 상태
- Thread.Abort() 메소드를 호출하거나 Thread가 실행 중인 메소드가 종료되면 해당 상태가 된다.
- Background: Thread가 백그라운드로 동작되고 있음
- Foreground Thread는 하나라도 살아있는 동안 프로세스가 죽지 않지만, Background는 여러개가 살아있어도 프로세스가 죽고 사는것에 영향을 미치지 않는다.
5. Thread C# 예제
- Thread 생성 및 실행
class ThreadTest { static void Main() { Thread t = new Thread (WriteY); // Kick off a new thread t.Start(); // running WriteY() // Simultaneously, do something on the main thread. for (int i = 0; i < 1000; i++) Console.Write ("x"); } static void WriteY() { for (int i = 0; i < 1000; i++) Console.Write ("y"); } }
- Thread 정지 및 일시정지
* Thread.Join 해당 Thread 가 끝날 때까지 다른 Thread를 대기시킵니다.
static void Main() { Thread t = new Thread (Go); t.Start(); t.Join(); Console.WriteLine("Thread t has ended!"); } static void Go() { for (int i = 0; i < 1000; i++) Console.Write ("y"); }
* Thread.Sleep 현재 Thread를 특정한 시간만큼 일시정지시킵니다.
Thread.Sleep(TimeSpan.FromHours (1)); // sleep for 1 hour Thread.Sleep(500); // sleep for 500 milliseconds
Join과 Sleep 메서드는 Thread를 블럭시키므로 해당 시간동안 블럭된 Thread는 CPU 자원을 소모하지 않습니다.
- Thread 강제종료
static void Main() { Thread t = new Thread(DoWork); t.Start(); Thread.Sleep(5000); // 5초 대기 if (t.IsAlive) { Console.WriteLine("강제 종료"); t.Abort(); // 쓰레드 강제 종료 } else { Console.WriteLine("정상 종료"); } } static void DoWork() { try { while (true) { Console.WriteLine("쓰레드 실행 중..."); Thread.Sleep(1000); // 1초 대기 } } catch (ThreadAbortException ex) { Console.WriteLine("쓰레드 종료 예외 발생"); Console.WriteLine(ex.Message); } }
Thread.Abort() 메서드를 사용하면 해당 Thread 를 강제종료 시킬 수 있습니다.
- Thread 우선순위
static void Main(string[] args) { // 스레드 생성 및 우선순위 설정 Thread thread1 = new Thread(new ThreadStart(Worker)); thread1.Name = "Thread 1"; thread1.Priority = ThreadPriority.Highest; Thread thread2 = new Thread(new ThreadStart(Worker)); thread2.Name = "Thread 2"; thread2.Priority = ThreadPriority.Lowest; // 스레드 시작 thread1.Start(); thread2.Start(); // 메인 스레드가 먼저 종료되지 않도록 스레드가 종료될 때까지 대기 thread1.Join(); thread2.Join(); Console.WriteLine("All threads finished."); } static void Worker() { Console.WriteLine("Thread {0} started.", Thread.CurrentThread.Name); for (int i = 0; i < 5; i++) { Console.WriteLine("Thread {0} is working.", Thread.CurrentThread.Name); Thread.Sleep(500); } Console.WriteLine("Thread {0} finished.", Thread.CurrentThread.Name); }
'개념 Self Study📝 > C#' 카테고리의 다른 글
IEnumerable vs ObservableCollection (0) 2024.09.20 C#과 C++이 데이터를 주고 받는 방법(마샬링) (1) 2023.12.25 MVVM 사용할려면 알아야지 (1) 2023.07.06