C#교과서 마스터하기 43. 스레드(Thread)

https://www.youtube.com/watch?v=VZq7PqlUbyI&list=PLO56HZSjrPTB4NxAsEP8HRk6YKBDLbp7m&index=78

1. 스레드(Thread)

01. 스레드

  • 작업자 한명

02. 다중 스레딩

  • 동시에 여러 작업을 수행하여 앱의 응답성을 높이고, 다중 코어에서 처리량 향상

2. 프로젝트

01. test 코드

using System;
using static System.Console;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Diagnostics;
using System.Reflection;

namespace testProject
{
    class Restrant
    {
        public void MakeFood()
        {
            WriteLine("요리 시작");

            WriteLine("요리 종료");
        }
    }
    class Program
    {

        static void Main(string[] args)
        {
            (new Restrant()).MakeFood();
        }
    }
}

02. 코드 시간 체크해보기

using System;
using static System.Console;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Diagnostics;
using System.Reflection;

namespace testProject
{
    class Restrant
    {
        public void MakeFood()
        {
            WriteLine("요리 시작");
            DateTime start = DateTime.Now;

            WriteLine($"요리 종료 : {(DateTime.Now - start).TotalSeconds}");

        }
    }
    class Program
    {

        static void Main(string[] args)
        {
            (new Restrant()).MakeFood();
        }
    }
}

03. Thread.Sleep(); 사용해보기(동기)

  • (1)
using System;
using static System.Console;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Diagnostics;
using System.Reflection;
using System.Threading;

namespace testProject
{
    class Restrant
    {
        public void MakeFood()
        {
            WriteLine("요리 시작");
            DateTime start = DateTime.Now;

            void Egg()
            {
                Thread.Sleep(3000);
                WriteLine("달걀 3초");
            }
            Egg();

            WriteLine($"요리 종료 : {(DateTime.Now - start).TotalSeconds}");

        }
    }
    class Program
    {

        static void Main(string[] args)
        {
            (new Restrant()).MakeFood();
        }
    }
}

  • (2)
using System;
using static System.Console;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Diagnostics;
using System.Reflection;
using System.Threading;

namespace testProject
{
    class Restrant
    {
        public void MakeFood()
        {
            WriteLine("요리 시작");
            DateTime start = DateTime.Now;

            void Egg()
            {
                Thread.Sleep(3000);
                WriteLine("달걀 3초");
            }
            Egg();

            void Souap()
            {
                Thread.Sleep(5000);
                WriteLine("국 5초");
            }
            Souap();

            WriteLine($"요리 종료 : {(DateTime.Now - start).TotalSeconds}");

        }
    }
    class Program
    {

        static void Main(string[] args)
        {
            (new Restrant()).MakeFood();
        }
    }
}

  • (3)
using System;
using static System.Console;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Diagnostics;
using System.Reflection;
using System.Threading;

namespace testProject
{
    class Restrant
    {
        public void MakeFood()
        {
            WriteLine("요리 시작");
            DateTime start = DateTime.Now;

            void Egg()
            {
                Thread.Sleep(3000);
                WriteLine("달걀 3초");
            }
            Egg();

            void Souap()
            {
                Thread.Sleep(5000);
                WriteLine("국 5초");
            }
            Souap();

            void Rice()
            {
                Thread.Sleep(7000);
                WriteLine("국 5초");
            }
            Rice();

            WriteLine($"요리 종료 : {(DateTime.Now - start).TotalSeconds}");

        }
    }
    class Program
    {

        static void Main(string[] args)
        {
            (new Restrant()).MakeFood();
        }
    }
}

04. Thread 객체를 사용한 대리 실행(멀티 스레드 - 비동기)

  • async & await
    • .Start()(async), 각자 비동기로 실행
    • .Join()(await), 끝날 때 까지 대기
  • 단일 스레드 : 약 15초, 멀티 스레드(비동기) : 약 7초
using System;
using static System.Console;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Diagnostics;
using System.Reflection;
using System.Threading;

namespace testProject
{
    class Restrant
    {
        public void MakeFood()
        {
            WriteLine("요리 시작");
            DateTime start = DateTime.Now;

            void Egg()
            {
                Thread.Sleep(3000);
                WriteLine("달걀 3초");
            }
            // Egg();

            Thread t1 = new Thread(new ThreadStart(Egg)); // ThreadStart, 대리자

            void Souap()
            {
                Thread.Sleep(5000);
                WriteLine("국 5초");
            }
            // Souap();
            Thread t2 = new Thread(Souap); // 대리 실행

            /*
            void Rice()
            {
                Thread.Sleep(7000);
                WriteLine("밥 7초");
            }
            Rice();
            */
            Thread t3 = new Thread(() =>
            {
                Thread.Sleep(7000);
                WriteLine("밥 7초");
            }); // ThreadStart, 대리자

            // async, 각자 비동기로 실행
            t1.Start(); 
            t2.Start();
            t3.Start();
            // await, 끝날 때 까지 대기
            t1.Join(); 
            t2.Join();
            t3.Join();

            WriteLine($"요리 종료 : {(DateTime.Now - start).TotalSeconds}");

        }
    }
    class Program
    {

        static void Main(string[] args)
        {
            (new Restrant()).MakeFood();
        }
    }
}

  • 만약에 Join을 하지 않으면 다른 메서드가 실행된다

05. Parallel, 병렬처리(멀티CPU) 추가해서 실행해보기

using System;
using static System.Console;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Diagnostics;
using System.Reflection;
using System.Threading;
using System.Threading.Tasks;

namespace testProject
{
    class Restrant
    {
        public void MakeFood()
        {
            WriteLine("요리 시작");
            DateTime start = DateTime.Now;

            void Egg()
            {
                Thread.Sleep(3000);
                WriteLine("달걀 3초");
            }
            // Egg();

            Thread t1 = new Thread(new ThreadStart(Egg)); // ThreadStart, 대리자

            void Souap()
            {
                Thread.Sleep(5000);
                WriteLine("국 5초");
            }
            // Souap();
            Thread t2 = new Thread(Souap); // 대리 실행

            /*
            void Rice()
            {
                Thread.Sleep(7000);
                WriteLine("밥 7초");
            }
            Rice();
            */
            Thread t3 = new Thread(() =>
            {
                Thread.Sleep(7000);
                WriteLine("밥 7초");
            }); // ThreadStart, 대리자

            // async, 각자 비동기로 실행
            t1.Start(); 
            t2.Start();
            t3.Start();
            // await, 끝날 때 까지 대기
            t1.Join(); 
            t2.Join();
            t3.Join();

            WriteLine($"요리 종료 : {(DateTime.Now - start).TotalSeconds}");

            WriteLine("식사 시작");
            SingleProc(); // 단일 CPU
            MultiProc();  // 멀티 CPU
            WriteLine($"식사 종료 : {(DateTime.Now - start).TotalSeconds}");
        }


        private void SingleProc()
        {
            for (int i = 0; i < 20_000; i++)
            {
                WriteLine("수다");
            }
        }
        private void MultiProc()
        {
            // Parallel, 병렬처리
            Parallel.For(0, 20_000, (i) => { WriteLine("수다"); });
        }
    }
    class Program
    {

        static void Main(string[] args)
        {
            (new Restrant()).MakeFood();
        }
    }
}



좋은 웹페이지 즐겨찾기