如何:对制造者线程和使用者线程进行同步(C# 编程指南)的详细注释

using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;
using System.Threading;

namespace 网上实例重写代码
{
    public class SyncEvents
    {
        private EventWaitHandle _newItemEvent;//定义三个变量
        private EventWaitHandle _exitThreadEvent;
        private WaitHandle[] _evenArray;
         public SyncEvents()//为这个对象赋值
        {
            _newItemEvent = new AutoResetEvent(false);//开始状态为红灯
            _exitThreadEvent = new ManualResetEvent(false);//开始为红灯
            _evenArray = new WaitHandle[2];
            _evenArray[0] = _newItemEvent;
            _evenArray[1] = _exitThreadEvent;
         }//函数里面有参数

        public EventWaitHandle ExitThreadEvent
        {
           
             get   { return _exitThreadEvent;}//  这个属性的初始值为红灯
           

        }//三个属性,并取出来值
        public EventWaitHandle NewItemEvent
        {
          get {return _newItemEvent ;}
       
        }

        public WaitHandle[] EvenArray
        {
          get {return _evenArray ;}//evenArray是一个数组名,也是对象名

 }
        }

    public class Producer
    {

     private Queue<int> _queue;
     private SyncEvents _syncEvents;

        public Producer(Queue<int> q, SyncEvents e)
        {

            _queue = q;//通过这步取得外部信号
            _syncEvents = e;//通过这步取得外部的信号,这里的对象,已经拥有了外部的具体信息
        }
       //生产者的线程
      public void ThreadRun()
      {
       
          int count=0;
          Random r=new Random();
          while (!_syncEvents.ExitThreadEvent.WaitOne(0, false))//等待这个事件直到他变成红灯,就返回ture如果返回的是False,这个就变成了!ture为假(False)不等于真,就不执行这个程序。
          {  //没有收到线程终止信号就不断的循环下面的程序。

              lock (((ICollection)_queue).SyncRoot) //syncRoot的意思就是锁住这个列对象
              {
                  while (_queue.Count < 20)
                  {
                      _queue.Enqueue(r.Next(0, 100));//给这个数列赋值
                      _syncEvents.NewItemEvent.Set();//给新加事件发生终止信息
                      count++;
                  }
              }
          }
          System.Console.Write("生产者生产了{0}项", count);
    }
  }
    public class Consumer
    {
        private Queue<int> _queue;
        private SyncEvents _syncEvents;

        public Consumer(Queue<int> q, SyncEvents e)
        {

            _queue = q;
            _syncEvents = e;
        }

        //这里是消费者线程
        public void ThreadRun()
        {

            int conut = 0;
            while (WaitHandle.WaitAny(_syncEvents.EvenArray) != 1)//当退出和新增都没有收到信号时,程序就进行,删除操作。消费者行为
            {
                lock (((ICollection)_queue).SyncRoot)//还是锁定这个列单独使用
                {
                    int item = _queue.Dequeue();
                }
                conut++;
            }

            System.Console.Write("消费者消费了{0}", conut);
        }

 

   
   
    }
     public class ThreadSyncSample
     {
         private static   void ShowQueueContents(Queue<int> q)
         {
            lock (((ICollection)q).SyncRoot)
            {
               foreach(int item in q)
               {
                   System.Console.Write(" {0}",item);
               }
            }
             System .Console.WriteLine();
         }// 把它设计成静态方法。方便调用,可以减少实例话的过程
         static void Main()
         {
             Queue<int> queue = new Queue<int>();
             SyncEvents syncEvents = new SyncEvents();
             System.Console.WriteLine("下面设置工作线程");
             Producer producer = new Producer(queue, syncEvents);
             Consumer consumer = new Consumer(queue, syncEvents);
             Thread producerThread = new Thread(producer.ThreadRun);
             Thread consumerThread = new Thread(consumer.ThreadRun);

             System.Console.WriteLine("线程开始行动了");
             producerThread.Start();
             consumerThread.Start();
             for (int i = 0; i < 4; i++)
             {
                 Thread.Sleep(2500);
                 ShowQueueContents(queue);
             }
             System.Console.WriteLine("结束线程 ");
             syncEvents.ExitThreadEvent.Set();//放送信号,表示结束
             producerThread.Join();
             consumerThread.Join();
         }
}

 

 

 

 


}
   
 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值