这篇文章,纯属语言转换文章,引用了他人的思路,修改成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)后,就发现输出顺序正确了,我称它为排队等待响应(就好象在等待零钱后的反应速度,如果发呆太久,就...)
原来的文章是一个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)后,就发现输出顺序正确了,我称它为排队等待响应(就好象在等待零钱后的反应速度,如果发呆太久,就...)
解决方案 »
- WPF如何将主窗体像QQ概念版那样进行3D翻转
- InvokeRequired 什么意思?
- 如何让datagridview根据读出来的数据的长度改变列宽
- DataGridView 用dataAdapter.Update()来更新数据库 (添加行修改行)
- 想利用datagridviewlinkcell,点击单元格时,根据单元格里的值在控件中显示图片和播放视频?
- 如何去关闭一个From的实例?
- c#中如何使用snmp协议
- 在C#中如何改变Word文档中的文本框的位置和大小?在线结贴
- 如何设计Dialog式的窗体?
- 怎样读取非unicode的文本文件
- C#读写文件时出现文件未被释放问题,求教
- 正则问题 如何 取出正文内容
http://blog.csdn.net/much0726/archive/2008/12/08/3477893.aspx