반응형

스레드는 프로세스 내에서 실행되는 흐름의 단위를 말합니다.
프로세스 내에는 여러 개의 스레드가 존재할 수 있습니다.

그리고 여러개의 스레드로 여러 작업 들을 실행할 수 있습니다.
예를 들면, 어떠한 연산을 동시에 실행되게 할 수 있습니다.

동시에 연산을 진행하게 되면 다른 연산 결과를 얻을 수 있으므로 제대로 된 설계를 하여 스레드를 사용해야 합니다. 스레드는 프로세스 내에서 실행되는 흐름의 단위를 말합니다.
프로세스 내에는 여러 개의 스레드가 존재할 수 있습니다.

그리고 여러개의 스레드로 여러 작업 들을 실행할 수 있습니다.
예를 들면, 어떠한 연산을 동시에 실행되게 할 수 있습니다.

동시에 연산을 진행하게 되면 다른 연산 결과를 얻을 수 있으므로 제대로 된 설계를 하여 스레드를 사용해야 합니다.

바로 예제 코드 작성을 하여, 설명드리겠습니다.

다음과 같이 코드를 작성하면 쓰레드가 만들 수 있습니다.

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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
 
namespace ConsoleApplication1
{
    class Program
    {
        static void print()
        {
            for (int i = 0; i < 5; i++)
            {
                Console.WriteLine("out : {0}", i);
                Thread.Sleep(1000);
            }
        }
        static void Main(string[] args)
        {
            Thread thread = new Thread(new ThreadStart(print));
 
            thread.Start();
            
        }
    }
}
cs

using System.Threading를 사용하여 Thread클래스를 생성할 수 있습니다.

new Thread(new ThreadStart(print))로 스레드로 생성할 메서드를 델리게이트를 만들어서 스레드를 생성합니다.

thread.Start();로 시작합니다.

순차적으로 out : 0 ~ out : 5까지 출력되는것을 확인할 수 있습니다.

Main에서 print함수를 같이 실행 시켜봅니다.

1
2
3
4
5
6
7
8
static void Main(string[] args)
{
    Thread thread = new Thread(new ThreadStart(print));
 
    thread.Start();
 
    print();    // 이부분만 추가합니다.
}
cs

이렇게 한다면 새로 만든 print메서드를 사용하는  thread와 메인 스레드 두개가 동시에 진행되면서,
out : 0 ~ out : 5가 2개씩 찍히는 것을 확인할 수 있습니다.

쓰레드 실행 중에 종료를 하면 어떻게 할까요??

바로 Abort함수를 이용합니다.

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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
 
namespace ConsoleApplication1
{
    class Program
    {
        static void print()
        {
            for (int i = 0; i < 5; i++)
            {
                Console.WriteLine("out : {0}", i);
                Thread.Sleep(1000);
            }
        }
        static void Main(string[] args)
        {
            Thread thread = new Thread(new ThreadStart(print));
 
            thread.Start();
 
            Thread.Sleep(3000);
            thread.Abort();
            thread.Join();    // 종료대기
        }
    }
}
cs

이렇게 코드를 작성하면 3초 후 종료가 되어서 print메서드의 출력을 모두 할 수 없습니다.

Abort()를 호출하면, ThreadAbortException를 throw 하여 종료가 됩니다.

근데 Abort()는 지금 같이 간단한 코드에서는 문제가 생기지 않지만, 

바로 종료가 된다는 보장도 없으며, Join함수로 인해 종료 대기가 된다는 보장도 없습니다.

웬만하면 Abort()를 이용해서 종료하지 않는 편이 좋습니다.

다음과 같이 작성하면 throw 할 때 상태를 확인할 수 있습니다.

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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
 
namespace ConsoleApplication1
{
    class Program
    {
        static void print()
        {
            try
            {
                for (int i = 0; i < 5; i++)
                {
                    Console.WriteLine("out : {0}", i);
                    Thread.Sleep(1000);
                }
            }
            catch (ThreadAbortException e )
            {
                Console.WriteLine(e);
            }
            finally
            {
                Console.WriteLine("About Complete");
            }
        }
        static void Main(string[] args)
        {
            Thread thread = new Thread(new ThreadStart(print));
 
            thread.Start();
 
            Thread.Sleep(3000);
            thread.Abort();
            thread.Join();    // 종료대기
        }
    }
}
cs
반응형

'개발공부 > C#' 카테고리의 다른 글

[C#] 스레드 동기화(Lock, Monitor)  (0) 2019.11.05
[C#]컬렉션(Collections)  (0) 2019.10.31
C# 인터페이스(interface)  (0) 2019.10.30
[C#] 배열(Array)  (0) 2019.10.29
[C#] String.Format  (0) 2019.10.28

+ Recent posts