[Thread] Background/Foregrond 스레드 / Join()

8707 단어 CSThreadCS

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");
        }

    }

  • 실행 결과를 보게 되면 첫번째 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

좋은 웹페이지 즐겨찾기