2016年1月26日 星期二

C17_9 生產者與消費者問題 Warehouse.cs

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);
        }
    }
}

沒有留言: