黑马程序员技术交流社区
标题:
卖票程序
[打印本页]
作者:
fmi110
时间:
2015-10-8 22:11
标题:
卖票程序
a
public class SellTicketDemo {
/**
*编写 三个类 ticket,sellWindow,ticketSellCenter,代表票信息,售票窗口,售票中心,
*售票中心分配一定数量的票(多个窗口实现多线程售票)
*
*分析: 程序要实现的功能是卖票,跟卖票相关的操作有:设置票的总数setTicket(int num)、卖票sellTicket()、
*记录票的余数的变量 Ticket;
* 其中 ticketSellCenter 应该进行设置形式,即行使 setTiket的功能。售票窗 行使卖票功能。
* 因为卖票是多线程进行,所以设置票,卖票的行为会出现同时访问 票Ticket的情况,即他们需要进行同步。
* 考虑到函数同步需要使用同一个锁,所以把设置票的功能和卖票的功能放到同一个类中,方便实现同步。因此将他们
* 直接放到ticket类中,由其他类来调用
*/
public static void main(String[] args) {
Ticket t = new Ticket();//票的对象,所有操作都是对该对象进行
new TicketSellCenter(t).start();//启动设置线程,设置票的总数
for(int i = 0;i<3;i++){
new SellWindow(t).start();
}
}
}
class Ticket{
private int ticket;
public synchronized void setTicket(int num){//设置票的数量,需要同步
this.ticket = num;
System.out.println(Thread.currentThread().getName()+"设置票的总数为:"+num);
}
public synchronized void sellTicekt(){//卖票功能,需要同步
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
if(ticket>0){
System.out.println(Thread.currentThread().getName()+" 卖出一张票,剩余 "+(--ticket )+"张票");
}
}
public int getTicket(){//对外提供票的余数
return ticket;
}
}
class SellWindow extends Thread{
private Ticket t; //接收Ticket对象,保证卖票是对同一对象进行操作
public SellWindow(Ticket t) {
super();
this.t = t;
}
@Override
public void run() {//此线程的功能是卖票,所以在run里调用卖票的方法即可
while(t.getTicket()>0){//余票大于0时,进行卖票
t.sellTicekt();
}
}
}
class TicketSellCenter extends Thread{
private Ticket t; //接收Ticket对象,保证卖票是对同一对象进行操作
public TicketSellCenter(Ticket t) {
super();
this.t = t;
}
@Override
public void run() {//功能是设置票,所以调用设置的函数运行就可以,而不需要将设置行为的具体代码放在里面
t.setTicket(100);//设为100张票
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2