1. Thread
static void MainThread(object state)
{
for (int i = 0; i < 5; i++)
Console.WriteLine("Hello Thread!");
}
Thread t = new Thread(MainThread);
t.Name = "Test Thread";
t.IsBackground = true;
t.Start();
MainThread 라는 메서드를 정의하고, 해당 메서드를 실행하는 Thread 를 실행한다. 기본적으로 foreground 로 실행되기 때문에,
IsBackGround 를 true 로 변경하면 백그라운드에서 실행되며, Start 로 스레드를 실행시킬 수 있다.
2. Thread Pool
하지만 스레드가 필요할 때마다 위에 처럼 하나하나 지정해서 생성하면 관리가 어려워지게 된다.
그래서 ThreadPool 이라는 기능이 존재한다. Thread 를 자동으로 생성해주고 Pool 로 관리해줌.
ThreadPool.SetMinThreads(1, 1);
ThreadPool.SetMaxThreads(5, 5);
//background
for (int i = 0; i< 5; i++)
ThreadPool.QueueUserWorkItem(MainThread);
ThreadPool.QueueUserWorkItem(MainThread);
최소 1개 ~ 최대 5개를 가지도록 Set*Threads 메서드로 지정해준다.
그리고 QueueUserWorkItem 메서드로 MainThread 함수를 지정해준다.
(QueueUserWorkItem 인자가 callback 으로 여기서 지정해주려고 매개변수로 obj를 받는다.)
이렇게 되면 5개의 MainThread 가 실행되고 만약 MainThread 가 5개 모두 진행중이면 마지막에는 할당되지 못하고 기다리게 된다.
3. Task
Task 는 일감의 단위로 Thread 에 할당을 쉽게하고 다른 옵션을 지정해줄 수 있다.
for (int i = 0; i < 5; i++)
{
Task t = new Task(() => { while (true) { } }, TaskCreationOptions.LongRunning);
t.Start();
}
위와 같이 Task 로 함수를 지정하고, TaskCreationOptions.LongRunning 을 지정해주면 5개의 스레드가 돌지만 긴 작업이라고 명시해놓았기 때문에 이후 ThreadPool 에서 하나를 추가 요청해도 할당되어 다음 작업이 진행된다.
LongRunning 옵션이 태스크를 일반적인 스레드 풀 스레드 대신 전용 스레드를 사용하여 실행하도록 지시하기 때문이다.