[Thread] Background/Foregrond 스레드 / Join()
Background/Foregrond 비교
- 프로세스에 속하는 모든 foreground 스레드가 종료되면, 즉 프로세스가 종료되면 나머지 백그라운드 스레드는 중지된다.
- .IsBackground 프로퍼티로 값을 변경한다. 기본 값은 false이다.
Thread.Join 메서드
- 이 인스터가 나타내는 스레드가 종료될 때 까지 다른 호출 스레드를 차단한다.
🚀 예제
class Program
{
static void Main(string[] args)
{
Test shortTest = new Test(5);
Test longTest = new Test(30);
//스레드 생성
Thread foregroundThread = new Thread(new ThreadStart(shortTest.Loop));
Thread foregroundThread2 = new Thread(new ThreadStart(shortTest.Loop));
Thread backgroundThread = new Thread(new ThreadStart(longTest.Loop));
backgroundThread.IsBackground = true; // 스레드를 background로 변경 default 값은 false
//스레드 실행
foregroundThread.Start();
foregroundThread.Join(); //이 스레드가 종료될 때 까지 다른 호출 스레드를 차단
foregroundThread2.Start();
backgroundThread.Start();
}
}
class Test
{
int maxIterations; //최대 반복 횟수
public Test(int maxIterations)
{
this.maxIterations = maxIterations;
}
public void Loop()
{
for(int i =0; i<maxIterations; i++)
{
Console.WriteLine("{0} count: {1}", Thread.CurrentThread.IsBackground ? "Background Thread" : "Foreground Thread", i);
Thread.Sleep(250);
}
Console.WriteLine("{0} finished counting.", Thread.CurrentThread.IsBackground ? "Background Thread" : "Foreground Thread");
}
}
class Program
{
static void Main(string[] args)
{
Test shortTest = new Test(5);
Test longTest = new Test(30);
//스레드 생성
Thread foregroundThread = new Thread(new ThreadStart(shortTest.Loop));
Thread foregroundThread2 = new Thread(new ThreadStart(shortTest.Loop));
Thread backgroundThread = new Thread(new ThreadStart(longTest.Loop));
backgroundThread.IsBackground = true; // 스레드를 background로 변경 default 값은 false
//스레드 실행
foregroundThread.Start();
foregroundThread.Join(); //이 스레드가 종료될 때 까지 다른 호출 스레드를 차단
foregroundThread2.Start();
backgroundThread.Start();
}
}
class Test
{
int maxIterations; //최대 반복 횟수
public Test(int maxIterations)
{
this.maxIterations = maxIterations;
}
public void Loop()
{
for(int i =0; i<maxIterations; i++)
{
Console.WriteLine("{0} count: {1}", Thread.CurrentThread.IsBackground ? "Background Thread" : "Foreground Thread", i);
Thread.Sleep(250);
}
Console.WriteLine("{0} finished counting.", Thread.CurrentThread.IsBackground ? "Background Thread" : "Foreground Thread");
}
}
-
실행 결과를 보게 되면 첫번째 foreground 스레드가 실행되며, join() 메서드를 통해 다른 스레드 호출을 차단했기에 첫번째 foreground 스레드가 실행 종료될 때 까지는 다른 스레드의 호출이 찍히지 않다가, 첫번째 스레드가 종료되자 두번째 foreground 스레드와 background 스레드가 호출되는 것을 볼 수 있다.
-
두번째 foreground가 종료되면 모든 foreground가 종료되었기에 프로세스가 종료되고, 따라서 backgroud 스레드 또한 자동으로 중단된다.
Ref
https://docs.microsoft.com/ko-kr/dotnet/api/system.threading.thread.isbackground?view=net-6.0
https://docs.microsoft.com/ko-kr/dotnet/api/system.threading.thread.join?view=net-6.0
Author And Source
이 문제에 관하여([Thread] Background/Foregrond 스레드 / Join()), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@uchang903/Thread-BackgroundForegrond-스레드-Join저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)