본문 바로가기
프로그래밍/C#

C# Thread 클래스

by 뽀도 2017. 6. 20.

쓰레드란?

쓰레드는 어떠한 프로그램 내에서, 특히 프로세스 내에서 실행되는 흐름의 단위, 일반적으로 한 프로그램은 하나의 스레드를 가지고 있지만, 프로그램 환경에 따라 둘 이상의 스레드를 동시에 실행할 수 있다.

 

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

 

반응형

댓글