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


原创粉丝点击