제가 공부를 하면서 여러개의 쓰레드를 작동 시키면 동시다발적으로 쓰레드 들이 움직이게 되는데 이것을
"주차장 차단기" 처럼 차례대로 움직이는 방법이 없을까 하다가 알게 되어 저만의 방식로 포스팅을 해보도록 하겠습니다. :D
쓰레드란, 프로그램이 매순간! 어떻게 흘러가는지 보여주는 것이라고 생각하시면 됩니다.
한마디로 화면에 어떤것들이 움직이는 지와 그러한 것들이 어떤흐름으로 움직이는지 보여주는 것이라고 생각하면 이해하기가 좀더 수월하겠습니다. 예를 들면, 제가 공을 던지면 공이 움직이겠죠? 공이 직선이든 곡선이든 어떠한 방향으로 움직일텐데 이것을 쓰레드 라고 할 수 있습니다. 이 정도면 잘 이해 하셨을거 같습니다. :D
프로그래밍 하면서 쓰레드 라는게 정말 중요하고 잘 다뤄야 합니다.
아래 예시를 보고 한번 기본적인 쓰레드구성을 보겠습니다.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace blog
{
class Program
{
static void Main(string[] args)
{
WorkThread thread = new WorkThread();
Thread _A = new Thread(thread.Thread_A);
Thread _B = new Thread(thread.Thread_B);
_A.Start();
_B.Start();
}
}
class WorkThread
{
public void Thread_A()
{
int count = 0;
while (count < 5)
{
Thread.Sleep(1000);
Console.WriteLine("Thread A Start!!");
Console.WriteLine("Thread A End!!");
count++;
}
}
public void Thread_B()
{
int count = 0;
while(count < 5)
{
Thread.Sleep(1000);
Console.WriteLine("Thread B Start!!");
Console.WriteLine("Thread B End!!");
count ++;
}
}
}
}
이런식 으로 정말 간단하게 1초마다 Thread_A와 Thread_B가 동시에 작동하도록 했습니다.
그럼 결과 화면으로는 아래 사진이 되겠습니다.
이렇게 어쩔땐 Thread_A가 먼저 실행되고 어쩔땐 Thread_B가 먼저 실행되는 엉망진창인 결과 화면이 되겠습니다
:(
하지만 여기서 C# "AutoResetEvent" 신호형식의 쓰레드 제어를 하게 되면 A쓰레드가 끝나면 B쓰레드가 실행되는 식으로 할수 있습니다.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace blog
{
class Program
{
static void Main(string[] args)
{
WorkThread thread = new WorkThread();
Thread _A = new Thread(thread.Thread_A);
Thread _B = new Thread(thread.Thread_B);
_A.Start();
_B.Start();
}
}
class WorkThread
{
private AutoResetEvent A_evt = new AutoResetEvent(true);
private AutoResetEvent B_evt = new AutoResetEvent(false);//A쓰레드가 먼저 실행되어야 하기때문에 B쓰레드 제어는 false
public void Thread_A()
{
int count = 0;
//A 쓰레드빼고 차단
A_evt.WaitOne();
while (count < 5)
{
Thread.Sleep(1000);
Console.WriteLine("Thread A Start!!");
Console.WriteLine("Thread A End!!");
count++;
}
//이 쓰레드는 끝났으니 B한테 신호보냄
B_evt.Set();
}
public void Thread_B()
{
int count = 0;
//B 쓰레드 빼고 차단
B_evt.WaitOne();
while(count < 5)
{
Thread.Sleep(1000);
Console.WriteLine("Thread B Start!!");
Console.WriteLine("Thread B End!!");
count ++;
}
A_evt.Set();
}
}
}
이렇게 정말 간단히 쓰레드를 구성해보았습니다. 이렇게 코딩을 하면 출력화면으로는
이렇게 A 쓰레드가 다 완료되면 다음 B 쓰레드로 넘어가는 과정이 되겠습니다.
예시로 보여준 소스는 정말 간단히 구성한 소스이니 이렇게 작동하는 구나 라고 알고 본인의 스타일대로 코딩하시면 되겠습니다. :D