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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 安然无恙 初级黑马   /  2015-10-8 20:06  /  479 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 安然无恙 于 2015-10-8 20:14 编辑
编写 三个类 ticket,sellWindow,ticketSellCenter,代表票信息,售票窗口,售票中心,售票中心分配一定数量的票(多个窗口实现多线程售票)
这道题我有答案,但是三个类不知道先写哪个类,方法都是互通的,先写哪个类都写不完整,求大神带上思路和代码! 在下感激不尽!良辰必有重谢下面是我的代码,参考的别人的答案,但是不知从哪个类下手,注释自己添加的,有不对的希望大神指正!
  1. //测试类
  2. public class MianShi{
  3.         public static void main(String[] args) {
  4.         //创建对象
  5.         MianShi t = new MianShi();
  6.         //调用票信息
  7.     t.new Ticket();
  8. }
  9. //票信息
  10. class Ticket {
  11.         //构造方法
  12.         public Ticket() {
  13.         //售票中心有一百张票
  14.         TicketSealCenter tsc = new TicketSealCenter(100);
  15.         // 创建5个窗口(循环5次)
  16.         for (int i = 1; i <= 5; i++) {
  17.         //创建窗口  创建售票窗口对象 传入窗口和票数
  18.      Thread t = new Thread(new SealWindow(i, tsc));
  19.      //开启线程
  20.      t.start();
  21.                 }
  22.         }
  23. }


  24. //售票中心类 定义了票的总数,同步售票方法
  25. class TicketSealCenter {
  26.         //初始化票数
  27.         int ticketNum = 0;
  28.         // 定义票是否卖完
  29.         boolean flag = false;
  30.         // 定义一个改变票数的方法
  31.         public TicketSealCenter(int num) {
  32.                 //把100张票赋值给当前变量
  33.                 this.ticketNum = num;
  34. }
  35. //同步方法
  36. public synchronized void sellTicket(SealWindow s) {
  37. //票数如果大于0
  38.   if (ticketNum > 0) {
  39.         //就把票数分配到各窗口
  40.     int n = s.num;
  41.     //票数--
  42.     System.out.println("第" + n + "售票窗口卖出了第" + (ticketNum--) + "张票");
  43.   } else {
  44.         //否则就为true
  45.     flag = true;
  46.                   }
  47.         }
  48. }


  49. //创建售票窗口类
  50. class SealWindow implements Runnable {
  51.         //num表示第几号窗口
  52.         int num;
  53.         //tsc代表售票中心
  54.         TicketSealCenter tsc;
  55.         //构造方法   把窗口和售票中心
  56.     public SealWindow(int num, TicketSealCenter tsc) {
  57.       this.num = num;
  58.       this.tsc = tsc;
  59.     }
  60.     //重写run方法
  61.     public final void run() {
  62.             //只要售票中心的票数没卖完  就一直循环
  63.             while (!tsc.flag) {
  64.             // 调用售票中心类的同步票数
  65.         tsc.sellTicket(this);
  66.         try {
  67.         //延迟100毫秒
  68.           Thread.sleep(100);
  69.         } catch (InterruptedException e) {
  70.           e.printStackTrace();
  71.                         }
  72.                       }
  73.             }
  74.         }
  75. }
复制代码




5 个回复

倒序浏览
自己顶一下~   求助!!
回复 使用道具 举报
求助...  在线等   
回复 使用道具 举报
来啦  纯手打

  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. }
复制代码
回复 使用道具 举报
运行效果
  1. Thread-0设置票的总数为:100
  2. Thread-2 卖出一张票,剩余 99张票
  3. Thread-2 卖出一张票,剩余 98张票
  4. Thread-2 卖出一张票,剩余 97张票
  5. Thread-2 卖出一张票,剩余 96张票
  6. Thread-1 卖出一张票,剩余 95张票
  7. Thread-3 卖出一张票,剩余 94张票
  8. Thread-3 卖出一张票,剩余 93张票
  9. Thread-3 卖出一张票,剩余 92张票
  10. Thread-3 卖出一张票,剩余 91张票
  11. Thread-1 卖出一张票,剩余 90张票
  12. Thread-1 卖出一张票,剩余 89张票
  13. Thread-1 卖出一张票,剩余 88张票
  14. Thread-1 卖出一张票,剩余 87张票
  15. Thread-1 卖出一张票,剩余 86张票
  16. Thread-2 卖出一张票,剩余 85张票
  17. Thread-1 卖出一张票,剩余 84张票
  18. Thread-3 卖出一张票,剩余 83张票
  19. Thread-1 卖出一张票,剩余 82张票
  20. Thread-1 卖出一张票,剩余 81张票
  21. Thread-1 卖出一张票,剩余 80张票
  22. Thread-2 卖出一张票,剩余 79张票
  23. Thread-1 卖出一张票,剩余 78张票
  24. Thread-1 卖出一张票,剩余 77张票
  25. Thread-1 卖出一张票,剩余 76张票
  26. Thread-3 卖出一张票,剩余 75张票
  27. Thread-3 卖出一张票,剩余 74张票
  28. Thread-3 卖出一张票,剩余 73张票
  29. Thread-3 卖出一张票,剩余 72张票
复制代码

评分

参与人数 1黑马币 +4 收起 理由
安然无恙 + 4 赞一个! 谢谢大神~ 这代码简洁多了~.

查看全部评分

回复 使用道具 举报

容我看看~~  谢谢大神
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马