c# 多线程2 源码
来源:互联网 发布:中华合众国知乎 编辑:程序博客网 时间:2024/06/16 09:08
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading;namespace ConsoleApplication1{ class Test { static SalesLady saleslady = new SalesLady(14, 0, 0); static EventWaitHandle wh = new AutoResetEvent(false); //static void Main() //{ // int[] moneies = { 10, 10, 5, 10, 5, 10, 5, 5, 10, 5, 10, 5, 5, 10, 5 }; // Thread[] aThreadArray = new Thread[20]; // Console.WriteLine("现在开始售票:"); // for (int i = 0; i < moneies.Length; i++) // { // CustomerClass cc = new CustomerClass(i + 1, moneies[i]); // aThreadArray[i] = new Thread(cc.run); // aThreadArray[i].Start(); // // Thread.Sleep(0);//当前线程让出时间片 如果有上个被唤醒的线程 让其先执行 // } // for (int i = 0; i < moneies.Length; i++) // { // try // { // aThreadArray[i].Join(); // } // catch (Exception e) // { // Console.WriteLine(e.ToString()); // } // } // Console.WriteLine("票已售完" + saleslady.memontoes); // Console.Read(); //} class SalesLady { public int memontoes, five, ten; public SalesLady(int m, int f, int t) { memontoes = m; five = f; ten = t; } public String ruleForSale(int num, int money)//同步的方法(同时对多个线程可见的方法)同时只能有1个线程运行 { String s = null; if (memontoes <= 0) return "对不起,已经售完"; if (money == 5) { memontoes--; five++; s = "给你票,你的钱正好。"; //notifyAll(); wh.Set(); //唤醒 } else if (money == 10) { while (five < 1) { try { Console.WriteLine("" + num + "号顾客用10元购票,请等待"); //wait(); wh.WaitOne(); // Thread.Sleep(1); } catch (Exception e) { Console.WriteLine(e.ToString()); } // 如果你的线程能够运行到这里,那么一定有一个five,此时就看哪个线程先被执行了 // 因为是同步方法,其中获得运行权利的线程,必须运行结束才会让其它的线程运行 // 所以当再次判断时,那个finve又没有了。 // 不会出现没有five却找零的问题。 } // 如果你的线程能够运行到这里,那么其一定有一个five, // 所以这个线程不会出现没有five而找零的问题 if (memontoes <= 0) { return "对不起,已经售完"; } memontoes--; five -= 1; ten++; s = "给你票,找你5元。"; } return s; } } // 顾客 class CustomerClass { int num, money; public void run() { Console.WriteLine("我是" + num + "号顾客,用" + money + "元购票,售票员说:" + saleslady.ruleForSale(num, money)); } public CustomerClass(int n, int m) { num = n; money = m; } } }}