Thread t = new Thread(TestThread);
t.Name = "TestThread";
t.IsBackground = true;
// default = false, true 시 메인이 끝나면 백그라운드 스레드도 꺼지게 된다.
t.Start();
t.Join(); // 생성된 스레드의 종료를 기다림
ThreadPool.QueueUserWorkItem(TestThread);
thread를 완전히 새로 만드는 것은 비용이 상대적으로 크기 때문에
threadpool을 이용하여 백그라운드에서 돌아가는 스레드를 유동적으로 사용할 수 있음
단 thread는 새로 만들 수 있는 스레드의 수가 상대적으로 크다.
threadpool은 스레드 수의 제한이 상대적으로 작고
풀링할 수 있는 스레드가 없을 시 스레드가 생길 때까지 원하는 함수가 실행되지 않음
=> 오래걸리는 일들은 스레드를 새로 생성하여 사용, 빨리 끝날 수 있는 일은 pool 사용
Task task = new Task( () => { while (true) { } }, TaskCreationOptions.LongRunning);
task.Start();
task.Wait(); // 태스크 종료 대기
task는 생성 시 인자를 통해 풀링하여 스레드를 사용할건지 아니면 새롭게 만들건지 등을 지정할 수 있음