首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

[C#]模拟多人不同面值购票找零的多线程代码解决办法

2012-01-01 
[C#]模拟多人不同面值购票找零的多线程代码这篇文章,纯属语言转换文章,引用了他人的思路,修改成C#的线程思

[C#]模拟多人不同面值购票找零的多线程代码
这篇文章,纯属语言转换文章,引用了他人的思路,修改成C#的线程思想,还有许多不完善的地方,希望在讨论中不断完善.
原来的文章是一个Java写的,作者是java2000_net(老紫竹)
原文地址:http://blog.csdn.net/java2000_net/archive/2008/10/19/3083836.aspx
一个偶然的机会,我看到了那篇文章,感觉思路挺有趣,就想把他转换成C#的来学习.时间紧凑,到12月初才有空来做.(这里罗嗦下,很崇拜两个.net专家:高歌,sp1234)
在这里顺便暗喜下在CSDN混的这几个月,.net版块技术排名挤入四位数.^-^,散分.

C# code
 
    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)后,就发现输出顺序正确了,我称它为排队等待响应(就好象在等待零钱后的反应速度,如果发呆太久,就...)

[解决办法]
下班了,先mark,回去再看。
[解决办法]
学习学习
[解决办法]
看了,不错.一会去跑下.
[解决办法]
学习学习,对于线程还是一知半解
[解决办法]
先留个记号,回去看
[解决办法]
mark,学习了。
[解决办法]
mark
[解决办法]
现在开始售票:
1号顾客用10元购票,请等待
2号顾客用10元购票,请等待
我是3号顾客,用5元购票,售票员说:给你票,你的钱正好。
我是4号顾客,用10元购票,售票员说:给你票,找你5元。
1号顾客用10元购票,请等待
我是5号顾客,用5元购票,售票员说:给你票,你的钱正好。
我是2号顾客,用10元购票,售票员说:给你票,找你5元。
6号顾客用10元购票,请等待
我是7号顾客,用5元购票,售票员说:给你票,你的钱正好。
我是8号顾客,用5元购票,售票员说:给你票,你的钱正好。
我是1号顾客,用10元购票,售票员说:给你票,找你5元。
我是6号顾客,用10元购票,售票员说:给你票,找你5元。
9号顾客用10元购票,请等待
我是10号顾客,用5元购票,售票员说:给你票,你的钱正好。
我是9号顾客,用10元购票,售票员说:给你票,找你5元。
11号顾客用10元购票,请等待
我是12号顾客,用5元购票,售票员说:给你票,你的钱正好。
我是11号顾客,用10元购票,售票员说:给你票,找你5元。
我是13号顾客,用5元购票,售票员说:给你票,你的钱正好。
我是14号顾客,用10元购票,售票员说:给你票,找你5元。
我是15号顾客,用5元购票,售票员说:对不起,已经售完
票已售完0

[解决办法]
我也收藏了 http://www.java2000.net/p13042

呵呵!
[解决办法]
up
[解决办法]
mark 学习!
[解决办法]
有点意思。。。不错。
[解决办法]
学习了
[解决办法]
学习了
[解决办法]
学习了
[解决办法]
JFL

热点排行