黑马程序员技术交流社区

标题: 卖票程序 [打印本页]

作者: fmi110    时间: 2015-10-8 22:11
标题: 卖票程序
a

  1. public class SellTicketDemo {

  2.         /**
  3.          *编写 三个类 ticket,sellWindow,ticketSellCenter,代表票信息,售票窗口,售票中心,
  4.          *售票中心分配一定数量的票(多个窗口实现多线程售票)
  5.          *
  6.          *分析:        程序要实现的功能是卖票,跟卖票相关的操作有:设置票的总数setTicket(int num)、卖票sellTicket()、
  7.          *记录票的余数的变量 Ticket;
  8.          *        其中 ticketSellCenter 应该进行设置形式,即行使 setTiket的功能。售票窗 行使卖票功能。
  9.          *        因为卖票是多线程进行,所以设置票,卖票的行为会出现同时访问 票Ticket的情况,即他们需要进行同步。
  10.          *        考虑到函数同步需要使用同一个锁,所以把设置票的功能和卖票的功能放到同一个类中,方便实现同步。因此将他们
  11.          *        直接放到ticket类中,由其他类来调用
  12.          */
  13.         public static void main(String[] args) {
  14.                 Ticket t = new Ticket();//票的对象,所有操作都是对该对象进行
  15.                 new TicketSellCenter(t).start();//启动设置线程,设置票的总数
  16.                 for(int i = 0;i<3;i++){
  17.                         new SellWindow(t).start();
  18.                 }
  19.         }

  20. }
  21. class Ticket{
  22.         private int ticket;
  23.         public synchronized void setTicket(int num){//设置票的数量,需要同步
  24.                 this.ticket = num;
  25.                 System.out.println(Thread.currentThread().getName()+"设置票的总数为:"+num);
  26.         }
  27.         public synchronized void sellTicekt(){//卖票功能,需要同步
  28.                 try {
  29.                         Thread.sleep(50);
  30.                 } catch (InterruptedException e) {
  31.                         e.printStackTrace();
  32.                 }
  33.                 if(ticket>0){
  34.                         System.out.println(Thread.currentThread().getName()+" 卖出一张票,剩余 "+(--ticket )+"张票");
  35.                 }
  36.         }
  37.         public int getTicket(){//对外提供票的余数
  38.                 return ticket;
  39.         }
  40. }
  41. class SellWindow extends Thread{
  42.         private Ticket t; //接收Ticket对象,保证卖票是对同一对象进行操作

  43.         public SellWindow(Ticket t) {
  44.                 super();
  45.                 this.t = t;
  46.         }
  47.         @Override
  48.         public void run() {//此线程的功能是卖票,所以在run里调用卖票的方法即可
  49.                 while(t.getTicket()>0){//余票大于0时,进行卖票
  50.                         t.sellTicekt();
  51.                 }
  52.         }
  53. }
  54. class TicketSellCenter extends Thread{
  55.         private Ticket t; //接收Ticket对象,保证卖票是对同一对象进行操作

  56.         public TicketSellCenter(Ticket t) {
  57.                 super();
  58.                 this.t = t;
  59.         }
  60.         @Override
  61.         public void run() {//功能是设置票,所以调用设置的函数运行就可以,而不需要将设置行为的具体代码放在里面
  62.                 t.setTicket(100);//设为100张票
  63.         }
  64. }
复制代码







欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2