class Program { static Thread SeekBookThread = new Thread(new ThreadStart(TestMutiThrd.SeekProc)); static Thread payMoneyThread = new Thread(new ThreadStart(TestMutiThrd.PayMoneyProc)); static Thread getBookThread = new Thread(new ThreadStart(TestMutiThrd.GetBookProc)); static void Main(string[] args) { SeekBookThread.Name = "扫描线程"; SeekBookThread.Start(); payMoneyThread.Name = "付钱线程"; payMoneyThread.Start(); getBookThread.Name = "取书线程"; getBookThread.Start(); for (int i = 1; i <= TestMutiThrd.numIterations; i++) { Console.WriteLine("买书线程:书本{0}", i); TestMutiThrd.number = i; //Signal that a value has been written. TestMutiThrd.SekEvent.Set();//解锁扫描线程 TestMutiThrd.buyResetEvent.WaitOne();//等待买书所有线程执行结束,才能继续 Thread.Sleep(0); } Thread.Sleep(1000); Console.ReadLine(); SeekBookThread.Abort(); payMoneyThread.Abort(); getBookThread.Abort(); } } public class TestMutiThrd { public const int numIterations = 50; //买书 public static AutoResetEvent buyResetEvent = new AutoResetEvent(false); //扫描 public static AutoResetEvent SekEvent = new AutoResetEvent(false); //付钱 public static AutoResetEvent PayEvent = new AutoResetEvent(false); //取书 public static AutoResetEvent GetEvent = new AutoResetEvent(false); //付钱和取书 public static ManualResetEvent PayGetEvent = new ManualResetEvent(false); public static ReaderWriterLock RWLock = new ReaderWriterLock(); //static ManualResetEvent myResetEvent = new ManualResetEvent(false); //static ManualResetEvent ChangeEvent = new ManualResetEvent(false); public static int number; //这是关键资源 public static TestMutiThrd OTestMutiThrd = new TestMutiThrd(); public int NumIterations { get { return numIterations; } } /// <summary> /// 扫描过程 /// </summary> public static void SeekProc() { while (true) //(thread.ThreadState != ThreadState.Aborted) { SekEvent.WaitOne(); //SekEvent.Reset(); Console.WriteLine("{0}:书本{1}", Thread.CurrentThread.Name, number); Thread.Sleep(0); PayEvent.Set();//解锁付款线程 //PayGetEvent.Set();//同时解锁付款和取书线程 } } /// <summary> /// 付钱过程 /// </summary> public static void PayMoneyProc() { while (true) { PayEvent.WaitOne(); Console.WriteLine("{0}:书本{1}", Thread.CurrentThread.Name, number); Thread.Sleep(10); GetEvent.Set();//解锁取书线程 } } /// <summary> /// 取书过程 /// </summary> public static void GetBookProc() { while (true) { GetEvent.WaitOne(); Console.WriteLine("{0}:书本{1}", Thread.CurrentThread.Name, number); Console.WriteLine("------------------------------------------"); Thread.Sleep(10); buyResetEvent.Set();//解锁买书线程 } } }