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

much0726 2008-12-08 05:49:21
这篇文章,纯属语言转换文章,引用了他人的思路,修改成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)后,就发现输出顺序正确了,我称它为排队等待响应(就好象在等待零钱后的反应速度,如果发呆太久,就...)
...全文
232 21 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
surewy 2008-12-09
  • 打赏
  • 举报
回复
现在开始售票:
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
surewy 2008-12-09
  • 打赏
  • 举报
回复
mark
happychou 2008-12-09
  • 打赏
  • 举报
回复
学习了
ppp7p 2008-12-09
  • 打赏
  • 举报
回复
有点意思。。。不错。
niitnanfeng 2008-12-09
  • 打赏
  • 举报
回复
mark,学习了。
chxg99 2008-12-09
  • 打赏
  • 举报
回复
mark 学习!
much0726 2008-12-09
  • 打赏
  • 举报
回复
自己UP
bidisty 2008-12-09
  • 打赏
  • 举报
回复
JFL
wxhx0502 2008-12-09
  • 打赏
  • 举报
回复
学习了
much0726 2008-12-09
  • 打赏
  • 举报
回复
自己再顶下,明天结贴了。
much0726 2008-12-09
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 java2000_net 的回复:]
我也收藏了 http://www.java2000.net/p13042

呵呵!
[/Quote]
多谢支持.呵呵
Joschime 2008-12-09
  • 打赏
  • 举报
回复
up
老紫竹 2008-12-09
  • 打赏
  • 举报
回复
我也收藏了 http://www.java2000.net/p13042

呵呵!
zhongxiutao123 2008-12-09
  • 打赏
  • 举报
回复
学习了
much0726 2008-12-08
  • 打赏
  • 举报
回复
第一次散分,忘记了在标题里注明了。失误,CSDN又没办法修改标题的。
wangping_li 2008-12-08
  • 打赏
  • 举报
回复
先留个记号,回去看
pouding 2008-12-08
  • 打赏
  • 举报
回复
学习学习,对于线程还是一知半解
liningln0 2008-12-08
  • 打赏
  • 举报
回复
看了,不错.一会去跑下.
liningln0 2008-12-08
  • 打赏
  • 举报
回复
学习学习
flyjimi 2008-12-08
  • 打赏
  • 举报
回复
下班了,先mark,回去再看。
加载更多回复(1)

111,097

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧