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();
}
}
}
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();
}
}
}
Author And Source
이 문제에 관하여(C#교과서 마스터하기 43. 스레드(Thread)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@ansalstmd/C교과서-마스터하기-43.-스레드Thread저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)