// C#
using System;
using System.Threading;
namespace Thread_EX
{
class RamenCook
{
private int ramenCount;
private string[] burners = { "_", "_", "_", "_" };
public RamenCook(int count)
{
ramenCount = count;
}
public void Run() // Thread Run
{
while (ramenCount > 0)
{
// 다중의 스레드가 동시에 실행되면 ramenCount가 하나만 줄어드는 것을 방지하기
// 위해서 lock으로 보호.
lock (this)
{
ramenCount--;
Console.WriteLine(Thread.CurrentThread.Name + " : " + ramenCount + "개 남음");
}
// 빈 버너를 찾고 해당 스레드의 이름으로 버너를 차지하고 라면 조리
for (int i = 0; i < burners.Length; i++)
{
if (!burners[i].Equals("_")) continue;
// 다중의 스레드가 동시에 불을 켜지 못하도록 방지
lock (this)
{
burners[i] = Thread.CurrentThread.Name;
Console.WriteLine(" " + Thread.CurrentThread.Name + " : [" + (i + 1) + "]번 버너 ON");
ShowBurners();
}
try
{
// 해당 스레드를 일정시간 정지(라면이 끓을 시간을 표현해 보았음...)
Thread.Sleep(2000); // 2초
}
catch (Exception e)
{
Console.WriteLine("Stack Trace1 : " + e.StackTrace);
}
// 해당 버너를 끄고 비움
lock (this)
{
burners[i] = "_";
Console.WriteLine(" " + Thread.CurrentThread.Name + " : [" + (i + 1) + "]번 버너 OFF");
ShowBurners();
}
break;
}
try
{
// 어느정도 순서가 뒤엉키도록
// 스레드마다 다음 라면을 끓이기까지 랜덤의 시간을 부여.
Random random = new Random();
Thread.Sleep(1000 * random.Next(1, 3));
}
catch (Exception e)
{
Console.WriteLine("Stack Trace2 : " + e.StackTrace);
}
} // end while
}
private void ShowBurners()
{
String stringToPrint = " ";
for (int i = 0; i < burners.Length; i++)
{
stringToPrint += (" " + burners[i]);
}
Console.WriteLine(stringToPrint);
}
}
class Program
{
static void Main(string[] args)
{
try
{
Console.WriteLine("만들 라면의 개수를 입력");
int ramenCount = int.Parse(Console.ReadLine());
RamenCook ramenCook = new RamenCook(ramenCount);
// 스레드 생성
Thread t1 = new Thread(ramenCook.Run);
Thread t2 = new Thread(ramenCook.Run);
Thread t3 = new Thread(ramenCook.Run);
Thread t4 = new Thread(ramenCook.Run);
// 스레드의 이름을 설정
t1.Name = "A";
t2.Name = "B";
t3.Name = "C";
t4.Name = "D";
// 스레드 시작
t1.Start();
t2.Start();
t3.Start();
t4.Start();
}
catch (Exception e)
{
Console.WriteLine("Exception Message" + e.Message);
}
}
}
}
// 위 코드를 실행해 보면, 순서가 섞여 나오는 것을 볼 수 있다.
// 각각이 동시에 실행이 된다는 것을 확인할 수 있다.