编写三各类Ticket、SealWindow、TicketSealCenter分别代表票信息、售票窗口、售票中心。售票中心分配一定数量的票,由若干个售票窗口进行出售,利用你所学的线程知识来模拟此售票过
package com.itheima;
/**
*第7题:编写三各类Ticket、SealWindow、TicketSealCenter分别代表票信息、售票窗口、售票中心。
*售票中心分配一定数量的票,由若干个售票窗口进行出售,利用你所学的线程知识来模拟此售票过程。
*分析:
*首先需要创建三个类,
*TicketSealCenter需要创建一个成员变量;并提供构造方法方便其他类的引用
*SealWindow用来对买票信息的同步,并提供构造方法方便其他类的引用
*Ticket,定义票的类型,并提供构造方法方便其他类的引用
*因为是多个窗口同时卖票,这几个窗口不能同时卖一张票,所有需要加入同步锁进行同步。
*/
public class Test7 {
public static void main(String[] args) {
//创建一个票信息的类,初始化票信息
Ticket t = new Ticket("车票",100);
//创建一个票价中心的类,初始化票的数量
TicketSealCenter ts = new TicketSealCenter(100);
//创建售票窗口的类
SealWindow sw = new SealWindow(t, ts);
//开启多个售票窗口,实现多窗口卖票
for(int x=0;x<3;x++){
new Thread(sw).start();
}
}
}
//票信息类
class Ticket{
// 名称
private String name ;
// 价格
private int price;
public Ticket() {
super();
// TODO Auto-generated constructor stub
}
public Ticket(String name, int price) {
super();
this.name = name;
this.price = price;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
}
//售票窗口类,实现Runnable接口
class SealWindow implements Runnable{
//用来获取售票中心的票数
int count;
Ticket t= new Ticket();
TicketSealCenter ts = new TicketSealCenter();
SealWindow(Ticket t,TicketSealCenter ts){
this.t=t;
this.ts = ts;
//获取票的数量赋值给count
count = ts.getTickets();
}
// 创建加锁对象
Object obj= new Object();
@Override
public void run() {
// 使用同步加锁
synchronized (obj) {
while(true){
// 如果票数大于0,说明还有票
if(count>0){
// 输出售票信息
System.out.println(Thread.currentThread().getName()+" "+" 名称:"+t.getName()+"\t"+" 剩余张数:"+count+" 价格:"+t.getPrice()+"元");
// 票数-1
count--;
}
}
}
}
}
//售票中心类
class TicketSealCenter{
//票的数量
private int tickets;
public TicketSealCenter() {
super();
// TODO Auto-generated constructor stub
}
public TicketSealCenter(int tickets) {
super();
this.tickets = tickets;
}
public int getTickets() {
return tickets;
}
public void setTickets(int tickets) {
this.tickets = tickets;
}
}