C# 쓰레드의 생성 (Thread 클래스)
C#에서 쓰레드를 만드는 기본적인 클래스로 System.Threading.Thread라는 클래스가 있다.
이 클래스의 생성자(Constructor)에 실행하고자 하는 메서드를 델리게이트로 지정한 후,
Thread클래스 객체에서 Start() 메서드를 호출하면 새로운 쓰레드가 생성되어 실행되게 된다.
아래 예는 동일 클래스 안의 Run() 메서드를 실행하는 쓰레드를 하나 생성한 후 실행시키는 예제이다.
예제에서는 기본적으로 생성된 메인 쓰레드에서도 동일하게 Run()메서드를 호출하고 있으므로, Begin/End문장이 2번 출력되고
있는데, 이는 2개의 쓰레드가 동시에 한 메서드를 실행하고 있기 때문이다.
예제
namespace MultiThrdApp
{
using System;
using System.Threading;
class Program
{
static void Main(string[] args)
{
new Program().DoTest();
}
void DoTest()
{
// 새로운 쓰레드에서 Run() 실행
Thread t1 = new Thread(new ThreadStart(Run));
t1.Start();
// 메인쓰레드에서 Run() 실행
Run();
}
// 출력
// Thread#1: Begin
// Thread#3: Begin
// Thread#1: End
// Thread#3: End
void Run()
{
Console.WriteLine("Thread#{0}: Begin", Thread.CurrentThread.ManagedThreadId);
// Do Something
Thread.Sleep(3000);
Console.WriteLine("Thread#{0}: End", Thread.CurrentThread.ManagedThreadId);
}
}
}
C# 쓰레스 생성의 다양한 예제
이 섹션은 .NET의 Thread 클래스를 이용해 쓰레드를 만드는 다양한 예를 들고 있다.
Thread클래스의 생성자가 받아들이는 파라미터는 ThreadStart 델리게이트와 ParameterizedThreadStart 델리게이트가 있는데,
이 섹션은 파라미터를 직접 전달하지 않는 메서드들에 사용하는 ThreadStart 델리게이트 사용 예제를 보여준다.
ThreadStart 델리게이트는 public delegate void ThreadStart();와 같이 정의되어 있는데, 리턴값과 파라미터 모두 void임을 알 수 있다.
따라서 파라미터와 리턴값이 없는 메서드는 델리게이트 객체로 생성될 수 있다. 아래 예에서 보이듯이, ThreadStart 델리게이트를 만족하는
다른 방식들 즉, 익명 메서드, 람다식 등도 모두 사용할 수 있다.
예제
class Program
{
static void Main(string[] args)
{
// Run 메서드를 입력받아
// ThreadStart 델리게이트 타입 객체를 생성한 후
// Thread 클래스 생성자에 전달
Thread t1 = new Thread(new ThreadStart(Run));
t1.Start();
// 컴파일러가 Run() 메서드의 함수 프로토타입으로부터
// ThreadStart Delegate객체를 추론하여 생성함
Thread t2 = new Thread(Run);
t2.Start();
// 익명메서드(Anonymous Method)를 사용하여
// 쓰레드 생성
Thread t3 = new Thread(delegate()
{
Run();
});
t3.Start();
// 람다식 (Lambda Expression)을 사용하여
// 쓰레드 생성
Thread t4 = new Thread(() => Run());
t4.Start();
// 간략한 표현
new Thread(() => Run()).Start();
}
static void Run()
{
Console.WriteLine("Run");
}
}
C# 쓰레스 생성 예 - 다른 클래스 메서드
동일 클래스가 아닌 다른 클래스의 메서드를 쓰레드에 호출하기 위해서는 해당 클래스의 객체를 생성한 후 (혹은 외부로부터 전달 받은 후)
그 객체의 메서드를 델리게이트로 Thread에 전달하면 된다.
예제
class Helper
{
public void Run()
{
Console.WriteLine("Helper.Run");
}
}
class Program
{
static void Main(string[] args)
{
// Helper클래스의 Run메서드 호출
Helper obj = new Helper();
Thread t = new Thread(obj.Run);
t.Start();
}
}
본 웹사이트는 광고를 포함하고 있습니다. 광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.