这篇文章,纯属语言转换文章,引用了他人的思路,修改成C#的线程思想,还有许多不完善的地方,希望在讨论中不断完善.
原来的文章是一个Java写的,作者是java2000_net(老紫竹)
原文地址:http://blog.csdn.net/java2000_net/archive/2008/10/19/3083836.aspx
一个偶然的机会,我看到了那篇文章,感觉思路挺有趣,就想把他转换成C#的来学习.时间紧凑,到12月初才有空来做.(这里罗嗦下,很崇拜两个.net专家:高歌,sp1234)
在这里顺便暗喜下在CSDN混的这几个月,.net版块技术排名挤入四位数.^-^,散分.    public 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) 
            { 
                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; 
            } 
        } 
    }一开始,我是在WaitOne()后面没有添加Thread.Sleep(1); 发现后面一个会顶上来先找零,然后,在输出刚好的.在调试的时候顺序是一样的,可能是C#的输出语句的关系吧,加上Sleep(1)后,就发现输出顺序正确了,我称它为排队等待响应(就好象在等待零钱后的反应速度,如果发呆太久,就...)