本文主要是介绍三人去电影院买票 一个拿5元 一人拿十元 一人拿20元 规定每张电影票5元,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题意 :
电影院卖票 : 售票员初始时有3张5元的票 。每张票5元。
三个人来买票 。一个人手里有5元,一个人手里有10元。一个人手里有20元。如果有零钱则购票成功,否则进行排队
思路:把售票员的票单独定义一个类 ,用于存放初始的票数 。
实现3个Runnable 类使用售票员类作为成员变量。三个类作为三位手持不同面额来进行购票的顾客。
ticket类
package com.SellTicket;public class Ticket {public int a5 = 3;public int a10 = 0;public int a20 = 0;public Ticket() {}public void SetTicket(int t1,int t2,int t3) {this.a5 += t1;this.a10 += t2;this.a20 += t3;}public void getTicket() {System.out.println("五元:" + a5+" 十元:"+a10+" 二十元:"+a20 +"总额为"+(a5*5+a10*10+a20*20));}}
三位顾客
package com.SellTicket;public class C1 implements Runnable{public Ticket ticket;public C1(Ticket tickets) {this.ticket = tickets;}@Overridepublic void run() {synchronized(ticket) {//定义我是拿5元来买票的System.out.println(Thread.currentThread().getName() + "购票成功");ticket.SetTicket(1, 0, 0);ticket.getTicket();//打印当前零钱信息ticket.notifyAll();//唤醒其他全部等待的线程}}}package com.SellTicket;public class C2 implements Runnable{public Ticket ticket;public C2(Ticket ticket1) {this.ticket = ticket1;}@Overridepublic void run() {//定义我是拿10元买票的synchronized(ticket) {if(ticket.a5 <=0) {//我要进入等待状态System.out.println(Thread.currentThread().getName()+"现在没有零钱,我要进入等待状态");try {ticket.wait();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}//到了这里说明ticket.a5 > 0了 我拿10元钱也能买票了System.out.println(Thread.currentThread().getName()+"购票成功");ticket.SetTicket(-1, 1, 0);//5元少一张 ,10元多一张ticket.getTicket();//打印当前零钱信息ticket.notifyAll();//唤醒全部等待线程}}}package com.SellTicket;public class C3 implements Runnable{public Ticket ticket;public C3(Ticket tickets) {this.ticket = tickets;}@Overridepublic void run() {// 我就是拿20元钱来买票的人synchronized(ticket) {if(ticket.a5 < 3 && (ticket.a5 < 1 && ticket.a10 < 1)){System.out.println(Thread.currentThread().getName() +"现在没有零钱,我需要等待");try {ticket.wait();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}System.out.println(Thread.currentThread().getName() + "购票成功");if(ticket.a5 >= 3) {//我用3张5元钱进行找零 ticket.SetTicket(-3, 0, 1);//5元少3张 ,20元多一张}else {ticket.SetTicket(-1, -1, 1);//5元少一张,10元少一张,20元多一张}ticket.getTicket();//获取当前票数信息ticket.notifyAll();}}}
实现类:
package com.SellTicket;public class Demo {public static void main(String[] args) {Ticket ticket =new Ticket();C1 c1 = new C1(ticket);C2 c2 = new C2(ticket);C3 c3 = new C3(ticket);Thread t1 = new Thread(c1,"5元来买票");Thread t2 = new Thread(c2,"10元来买票");Thread t3 = new Thread(c3,"20元来买票");t1.start();t2.start();t3.start();}}
运行结果:
这篇关于三人去电影院买票 一个拿5元 一人拿十元 一人拿20元 规定每张电影票5元的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!