A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 cs8630323 于 2015-2-15 18:48 编辑
  1. import java.util.concurrent.ExecutorService;
  2. import java.util.concurrent.Executors;

  3. /**
  4. 6、 编写三各类Ticket、SealWindow、TicketSealCenter分别代表票信息、售票窗口、售票中心。售票中心分配一定数量的票,
  5.         由若干个售票窗口进行出售,利用你所学的线程知识来模拟此售票过程。
  6. */
  7. public class Test6 {
  8.          public static void main(String [] args){
  9.              //使用线程池执行任务
  10.               ExecutorService pool = Executors.newCachedThreadPool();
  11.               pool.submit(new SealWindow("1号窗口"));
  12.               pool.submit(new SealWindow("2号窗口"));
  13.               pool.submit(new SealWindow("3号窗口"));
  14.               pool.submit(new SealWindow("4号窗口"));
  15.               pool.submit(new SealWindow("5号窗口"));
  16.          }
  17. }

  18. //票信息类。从售票中心获得票的数量,提供访问票数和修改票数方法
  19. class Ticket{
  20.   Ticket(int n){
  21.         num = n;
  22.   }
  23. private int num;
  24. public int get() { return num; }
  25. public void set(int n){ num = n; }
  26. }

  27. //售票中心类
  28. class TicketSealCenter {
  29.     private TicketSealCenter(){}
  30.     private static Ticket tic;//票信息对象
  31.     private int ticket = 100;//初始票数
  32.     private static TicketSealCenter cen;//售票中心对象

  33.     public synchronized void  sellTicket(SealWindow win){
  34.         if(ticket > 0) {
  35.             ticket--;//票销售了一张
  36.             tic.set(ticket);//修改票信息
  37.             System.out.println(win.getName()+"销售车票一张,还剩余"+tic.get());
  38.         }
  39.         else System.out.println("车票卖光了");
  40.     }
  41.    
  42.     //售票中心只有一个,使用单例创建。
  43.      public static TicketSealCenter center(){
  44.          if(cen == null){
  45.              synchronized(TicketSealCenter.class){
  46.                  if(cen == null)
  47.              cen = new TicketSealCenter();
  48.                  tic = new Ticket(cen.ticket);//票信息对象随着中心的建立而产生
  49.              }
  50.          }
  51.          return cen;
  52.      }
  53.      //返回票信息对象
  54.      public static Ticket getTicket(){
  55.          return tic;
  56.      }
  57. }
  58. //售票窗口类
  59. class SealWindow implements Runnable{
  60.     SealWindow(String name){
  61.         this.name = name;//设置窗口名
  62.     }
  63.    
  64.     private String name ;//窗口名
  65.     TicketSealCenter center = TicketSealCenter.center();//创建中心对象
  66.     Ticket tic = center.getTicket();//票信息对象
  67.     //访问窗口名方法
  68.     public String getName(){
  69.         return name;
  70.     }
  71.    
  72.     public void run(){
  73.         while(tic.get() > 0){
  74.                     center.sellTicket(this);//销售车票
  75.         try {
  76.             Thread.sleep(200);
  77.           } catch (InterruptedException e) {
  78.             e.printStackTrace();
  79.          }
  80.         }
  81.         
  82.         System.out.println(name +"已无车票,明天再来");
  83.     }
  84. }
复制代码

3 个回复

倒序浏览
运行没问题的吗啊?
回复 使用道具 举报
这里既然票题目要求是对象,那么 售票中心 下发的 应是票对象 ,所以 最好用集合来储存一部分票对象,楼主的方法 结果也是对的    但是 根据题目要求的话 应该是  用集合来 删除票对象 更符合题意
回复 使用道具 举报
还不错吧。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马