using System;
using System.Threading;
namespace SeverCore
{
internal class Program
{
static void MainThread()
{
for (int i=0; i<5; i++)
Console.WriteLine("Hello Thread!");
}
static void Main(string[] args)
{
Thread t = new Thread(MainThread);
t.Start();
t.Join();
Console.WriteLine("Hello World!");
}
}
}
쓰레드를 생성해서 실행하여 보았다.
new를 통해 쓰레드를 생성하는 것은 정규직을 고용하는 것과 같다. 관리가 번거로움.
Join() 함수는 쓰레드가 실행되고 끝날때까지 뒤의 작업이 대기상태가 된다.
using System;
using System.Threading;
namespace SeverCore
{
internal class Program
{
static void MainThread(object state)
{
for (int i=0; i<5; i++)
Console.WriteLine("Hello Thread!");
}
static void Main(string[] args)
{
ThreadPool.SetMinThreads(1, 1);
ThreadPool.SetMaxThreads(5, 5);
for (int i=0; i<5; i++)
{
ThreadPool.QueueUserWorkItem((object obj) => { while (true) { } });
}
ThreadPool.QueueUserWorkItem(MainThread);
Console.WriteLine("Hello World!");
}
}
}
ThreadPool.set을 통해 최소, 최대 쓰레드의 수를 정하였다.
ThreadPool은 단기 알바를 사용하는 것과 유사하다.
ThreadPool.QueueUserWorkItem()을 통해 함수를 쓰레드를 이용해서 실행 할 수 있다.
위의 경우 5개의 쓰레드가 무한루프를 도는 람다 함수를 실행하고 이후에 MainThread를 실행하도록 되어있다.
쓰레드 5개가 다 사용중이고 반납되지 않으므로 MainThread 함수는 실행되지 않는다.
static void Main(string[] args)
{
ThreadPool.SetMinThreads(1, 1);
ThreadPool.SetMaxThreads(5, 5);
for (int i=0; i<5; i++)
{
Task t = new Task(() => { while (true) { } }, TaskCreationOptions.LongRunning);
t.Start();
}
ThreadPool.QueueUserWorkItem(MainThread);
Console.WriteLine("Hello World!");
}
Task의 경우 Thread와 비슷하나, LongRunning 옵션을 줘서 작업 순서를 뒤로 늦춘다.
따라서 MainThread가 실행됨을 확인 할 수 있었다.