using System;
using System.Threading;
public class Warehouse
{
// 緩衝區,即昌庫
int whContents;
//狀態標誌,為true時可以取,為false正在放入
bool getFlag = false;
//獲取緩衝區的產品,及消費者
public int GetProduce()
{
lock (this)
{
//如果現在不可取
if (!getFlag)
{
try
{
//等待GetProduce方法中叫用Monitor.Pulse方法
Monitor.Wait(this);
}
catch (SynchronizationLockException e)
{
Console.WriteLine(e);
}
catch (ThreadInterruptedException e)
{
Console.WriteLine(e);
}
}
Console.WriteLine("消費產品:{0}", whContents);
//重置getFlag 標誌,表示消費行為已經完成
getFlag = false;
//通知 GetProduce方法(該方法在另外一個執行緒中執行,等待中)
Monitor.Pulse(this);
}
return whContents;
}
//向緩衝區放入產品,即生產者
public void SetProduce(int n)
{
lock (this)
{
if (getFlag)
{
try
{
Monitor.Wait(this);
}
catch (SynchronizationLockException e)
{
//當同步方法(指Monitor 累除了enter之外的方法)在非同步的程式碼區被叫用
Console.WriteLine(e);
}
catch (ThreadInterruptedException e)
{
//當執行蓄在等待狀態的時候終止
Console.WriteLine(e);
}
}
//放入產品
whContents = n;
Console.WriteLine("生產產品:{0}", whContents);
getFlag = true;
//通知另外一個執行緒正在等待的SetProduce方法
Monitor.Pulse(this);
}
}
}
沒有留言:
張貼留言