package study.my;
public class TicketSell {
/**
* @param args
* 多线程的同步控制与线程间的通信:
* 用synchronized、wait()和notifyAll()完成以下情景
* 模拟3个人排队买票,每人买一张票。售票员(TicketSeller类)只有1张5元的钱,电影票5元一张。
* 张某拿着1张20元的人民币排在第一,孙某拿着1张10元的人民币排在第二,赵某拿着1张5元的人民币排在第三。
* (提示:定义一个售票员TicketSeller类,属性包括5元钱张数fiveNumber、
* 10元钱张数tenNumber和20元钱张数twentyNumber,方法为同步方法卖票
* sellTicket(int receiveMoney), 创建三个线程张某Zhang、孙某Sun和赵某Zhao,
* 这三个线程共享一个售票员类对象。)
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("售票员: 现在开始售票,开放时间:10秒钟!");
Thread zhang = new Thread(new Zhang());
zhang.start();
Thread sun = new Thread(new Sun());
sun.start();
Thread zhao = new Thread(new Zhao());
zhao.start();
try
{
Thread.sleep(10000);//主线程挂起10秒
}
catch (InterruptedException e)
{
e.printStackTrace();
}
System.out.println("售票员: 今天的售票时间已过,请没有买到票的通知明天再来!");
if(zhang.isAlive())
{
zhang.stop();//如果thread1还存在则杀掉他
System.out.println("张先生: 我没有买到票,明天再来吧!");
}
else
System.out.println("张先生: 我买到票了!");
if(sun.isAlive())
{
sun.stop();//如果thread1还存在则杀掉他
System.out.println("孙小姐: 我没有买到票,明天再来吧!");
}
else
System.out.println("孙小姐: 我买到票了!");
if(zhao.isAlive())
{
zhao.stop();//如果thread1还存在则杀掉他
System.out.println("赵老师: 我没有买到票,明天再来吧!");
}
else
System.out.println("赵老师: 我买到票了!");
}
}
class TicketSeller{
private static int fiveNumber = 1;
private static int tenNumber = 0;
private static int twentyNumber = 0;
public static boolean sellTicket(int receiveMoney){
if(receiveMoney > fiveNumber*5+tenNumber*10+twentyNumber*20+5){
System.out.println("售票员: 对不起,您的钱面值太大,找不开,请稍等!");
return false;
}
else if(receiveMoney < 5)
{
System.out.println("售票员: 对不起,您的钱金额不足,请带足了再来!");
return false;
}
else{
if(receiveMoney == 5){
fiveNumber = fiveNumber +1;
System.out.println("售票员: 收您5元,这是您的票,请您收好!");
return true;
}
else if(receiveMoney == 10 && fiveNumber > 0)
{
fiveNumber = fiveNumber - 1;
tenNumber = tenNumber + 1;
System.out.println("售票员: 收您10元,找您5元,这是找您的钱和您的票,请您收好!");
return true;
}
else if(receiveMoney == 20 && fiveNumber > 0 && tenNumber > 0){
twentyNumber = twentyNumber + 1;
fiveNumber = fiveNumber - 1;
tenNumber = tenNumber - 1;
System.out.println("售票员: 收您20元,找您15元,这是找您的钱和您的票,请您收好!");
return true;
}
return false;
}
}
}
class Zhang implements Runnable {
boolean isGetTicket = false;
Zhang()
{
}
public synchronized void run()
{
while(!isGetTicket){
System.out.println("张先生: 我要买票,这是20元!");
if(TicketSeller.sellTicket(20)){
System.out.println("张先生: 谢谢您。");
isGetTicket = true;
}else{
System.out.println("张先生: 没关系,我去等待2秒!");
System.out.println("售票员: 下一个!");
try
{
Thread.sleep(2000);//挂起2秒
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
}
}
class Sun implements Runnable {
boolean isGetTicket = false;
Sun()
{
}
public synchronized void run()
{
while(!isGetTicket){
System.out.println("孙小姐: 我要买票,这是10元!");
if(TicketSeller.sellTicket(10)){
System.out.println("孙小姐: 谢谢您!");
isGetTicket = true;
}else{
System.out.println("孙小姐: 没关系,我去等待1秒!");
System.out.println("售票员: 下一个!");
try
{
Thread.sleep(1000);//挂起1秒
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
}
}
class Zhao implements Runnable {
boolean isGetTicket = false;
Zhao(){
}
public synchronized void run()
{
while(!isGetTicket){
System.out.println("赵老师: 我要买票,这是5元!");
if(TicketSeller.sellTicket(5)){
System.out.println("赵老师: 谢谢您!");
isGetTicket = true;
}else{
System.out.println("赵老师: 没关系,我去等待一下!");
System.out.println("售票员: 下一个!");
try
{
Thread.sleep(500);//挂起1秒
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
}
}
售票员: 现在开始售票,开放时间:10秒钟!
张先生: 我要买票,这是20元!
售票员: 对不起,您的钱面值太大,找不开,请稍等!
张先生: 没关系,我去等待2秒!
售票员: 下一个!
孙小姐: 我要买票,这是10元!
售票员: 收您10元,找您5元,这是找您的钱和您的票,请您收好!
孙小姐: 谢谢您!
赵老师: 我要买票,这是5元!
售票员: 收您5元,这是您的票,请您收好!
赵老师: 谢谢您!
张先生: 我要买票,这是20元!
售票员: 收您20元,找您15元,这是找您的钱和您的票,请您收好!
张先生: 谢谢您。
售票员: 今天的售票时间已过,请没有买到票的通知明天再来!
张先生: 我买到票了!
孙小姐: 我买到票了!
赵老师: 我买到票了!
0 分还那么多要求,你是我老板吗?气愤的飘过
是啊。0分要我们做这么多。。。
人是新来的,你二位就帮帮吧