C#: Thread 사용법과 프로퍼티, 예제
/*
* made by so_Sal
*/
스레드 개념에 대한 설명은 위 링크로 대신하겠습니다.
1. Thread의 실행
2. Property - IsBackground
3. Property - Priority
1. Thread의 실행
필요헤더:
using System.Threading;
스레드 생성 함수은 아래와같이 정의되어 있습니다.
public Thread (ThreadStart start [.int maxStackSize])
public Thread (ParameterizedThreadStart start [.int maxStackSize])
ThreadStart 함수는 파라미터가 존재하지 않을 때 간편하게 사용할 수 있는 함수이며
ParameterizedThreadStart 함수는 파라미터가 존재할 때 사용하는 함수입니다.
주의해야 할 점은 파라미터를 이용하는 스레드를 사용할 때, 스레드로 실행되는 function의 파라미터는
오직 Object 변수 하나만 있어야 한다는 것입니다.
//////// 메인 함수에서 5개의 Thread_function 함수를 동시에 실행하는 프로그램
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
class Program
{
static void Thread_Function(Object number)
{//ParameterizedThreadStart 를 이용하기 위해선 Parameter는 Object 하나여야 한다.
int number_thread = (int)number;
Console.WriteLine(number_thread + " Thread start()");
Thread.Sleep(500);
Console.WriteLine(number_thread + " Thread processing()");
Thread.Sleep(500);
Console.WriteLine(number_thread + " Thread End()");
}//3번의 출력을 하는 스레드 함수
static void Main(string[] args)
{
Thread[] T = new Thread[5];
for (int thread_number = 0; thread_number < 5; thread_number++)
{
T[thread_number] = new Thread(new ParameterizedThreadStart(Thread_Function));
T[thread_number].Start(thread_number);
}
for (int thread_number = 0; thread_number < 5; thread_number++)
T[thread_number].Join();
}
}
결과를 보시면 Thread_Function에 해당되는 함수 5개가 동시에 실행되는것을 볼 수 있습니다.
CPU 스케쥴링에 따라서 함수 실행의 순번도 달라지는걸 확인하실 수 있습니다.
2. Property - IsBackground
C# 스레드 프로세싱에서는 전경스레드와 배경스레드로 구분된다.
* 전경스레드
하나의 프로세스에서 전경스레드가 남아있다면 프로그램은 종료되지 않는다.
모든 전경스레드의 종료를 기다리기 때문에, 메인함수에서 return을 하더라도 프로그램은 종료되지 않는다.)
* 배경스레드
이에 비해 배경스레드는 프로세스의 종료에 별다른 영향을 주지 않는다.
프로세스가 종료될 때 배경스레드가 남아 있더라도 프로그램은 종료된다.
스레드 생성에서 Default = 전경스레드 이기 때문에, 배경스레드로 바꾸고 싶다면
IsBackground 프로퍼티를 true로 변경해주면 된다.
-------------------------------------------------------------------------
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
class Program
{
static void Thread_Function(Object number)
{//ParameterizedThreadStart 를 이용하기 위해선 Parameter는 Object 하나여야 한다.
int number_thread = (int)number;
Console.WriteLine(number_thread + " Thread start()");
Thread.Sleep(500);
Console.WriteLine(number_thread + " Thread processing()");
Thread.Sleep(500);
Console.WriteLine(number_thread + " Thread End()");
}//3번의 출력을 하는 스레드 함수
static void Main(string[] args)
{
Thread[] T = new Thread[5];
for (int thread_number = 0; thread_number < 5; thread_number++)
{
T[thread_number] = new Thread(new ParameterizedThreadStart(Thread_Function));
//T[thread_number].IsBackground = true;
T[thread_number].Start(thread_number);
}
Thread.Sleep(500);
return; //스레드 생성후 바로 종료함에도 불구하고 첫번쨰 예제와 같은 결과를 출력.
}
}
2번쨰 예제의 주석처리 된 T[thread_number].IsBackground = true; 까지 실행시켜 준다면 결과는 다음과 같다.
-------------------------------------------------------------------------
3. Property - Priority
위 예제에서 사용하던 Thread[] T 를 이용하였기 때문에 스레드변수 T에 thread_number를 붙여주었습니다.
ThreadPriority란 녀석의 정의를 보면 다음과 같이 되어있습니다.
Lowest = 0,
BelowNormal = 1,
Normal = 2,
AboveNormal = 3,
Highest = 4,
Thread 안의 Priority 변수에 숫자를 바로 넣어주셔도 되고
다음과 같이 enum 목록의 네임들을 사용해주셔도 무방합니다.