쓰레드란?
쓰레드는 어떠한 프로그램 내에서, 특히 프로세스 내에서 실행되는 흐름의 단위, 일반적으로 한 프로그램은 하나의 스레드를 가지고 있지만, 프로그램 환경에 따라 둘 이상의 스레드를 동시에 실행할 수 있다.
C# 쓰레드의 생성
C#에서 쓰레드를 만드는 기본적인 클래스로 System.Threading.Thread라는 클래스가 있다.
이 클래스의 생성자에 실행하고자 하는 메서드를 델리게이트로 지정한 후, Thread클래스 객체에서 Start() 메서드를 호출하면 새로운 쓰레드가 생성되어 실행되게 된다. 아래 예는 동일 클래스 안의 Run() 메서드를 실행하는 쓰레드를 하나 생성한 후 실행시키는 예제이다. 예제에서는 기본적으로 생성된 메인 쓰레드에서도 동일하게 Run메서드를 호출하고 있으므로, Begin/End문장이 2번 출력되고 있는데, 이는 2개의 쓰레드가 동시에 한 메서드를 실행하고 있기 때문이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 |
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
namespace csharp_study
{
class Program
{
static void Main(string[] args)
{
new Program().DoTest();
}
void DoTest()
{
Thread t1 = new Thread(new ThreadStart(Run));
t1.Start();
Run();
}
void Run()
{
Console.WriteLine("Thread#{0}:begin", Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(300);
Console.WriteLine("Thread#{0}:End", Thread.CurrentThread.ManagedThreadId);
}
}
}
|
cs |
C# 쓰레드 생성의 다양한 예제
이 섹션은 .NET의 Thread 클래스를 이용해 쓰레드를 만드는 다양한 예를 들고 있다. Thread클래스의 생성자가 받아들이는 파라미터는 ThreadStart 델리게이트와 ParameterizedThreadStart 델리게이트가 있는데, 이 섹션은 파라미터를 직접 전달하지 않는 메서드들에 사용하는 ThreadStart 델리게이트 사용 예제를 보여준다. ThreadStart 델리게이트는 public delegate void ThreadStart(); 와 같이 정의되어 있는데, 리턴값과 파라미터 모두 void임을 알 수 있다.
따라서 파라미터와 리턴값이 없는 메서드는 델리게이트 객체로 생성 될 수 있다. 아래 예에서 보이듯이, ThreadStart델리게이트를 만족하는 다른 방식들 즉, 익명 메서드, 람다식 등도 모두 사용할 수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43 |
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
namespace csharp_study
{
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();
//익명메서드를 사용하여 쓰레드 생성
Thread t3 = new Thread(delegate () { Run(); });
t3.Start();
// 람다식을 사용하여 쓰레드 생성
Thread t4 = new Thread(() => Run());
t4.Start();
//간략한 표현
new Thread(() => Run()).Start();
}
static void Run()
{
Console.WriteLine("Run!");
}
}
}
|
cs |
C# 쓰레드 생성 예 - 다른 클래스 메서드
동일 클래스가 아닌 다른 클래스의 메서드를 쓰레드에 호출하기 위해서는 해당 클래스의 객체를 생성한 후 (혹은 외부로부터 전달 받은 후) 그 객체의 메서드를 델리게이트로 Thread에 전달하면 된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 |
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
namespace csharp_study
{
class Program
{
static void Main(string[] args)
{
Hepler obj = new Hepler();
Thread t = new Thread(obj.Run);
t.Start();
}
}
class Hepler
{
public void Run()
{
Console.WriteLine("Maze Run!");
}
}
}
|
cs |
'프로그래밍 > C#' 카테고리의 다른 글
C# Mutex 동기화 코드 (0) | 2017.06.21 |
---|---|
C# Thread 2 (0) | 2017.06.20 |
C# 익명타입 : 클래스를 미리 정의하지 않고 사용하는 것. (0) | 2017.06.16 |
C# => Lambda Expression : 무명 함수를 표현하는데 사용 주로 Linq에서 많이 사용 (0) | 2017.06.16 |
C# Anonymous Method : 무명메서드, 일회용으로 메서드를 사용 할 때 (0) | 2017.06.15 |
댓글