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