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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© viliv715 中级黑马   /  2014-9-25 18:45  /  1206 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

需求:编写三各类Ticket、SealWindow、TicketSealCenter分别代表票信息、售票窗口、售票中心。售票中心分配一定数量的票,由若干个售票窗口进行出售。
运行的时候有重复的票号,我已经在卖票的方法上添加了synchronized关键字,还是会出现问题,但是我找不到问题出在哪里了,谢谢大家了
  1. public class TicketDemo {

  2.         public static void main(String[] args) {       
  3.                 new Thread(new SealWindow("1号窗口")).start();
  4.                 new Thread(new SealWindow("2号窗口")).start();
  5.                 new Thread(new SealWindow("3号窗口")).start();
  6.                 new Thread(new SealWindow("4号窗口")).start();
  7.         }
  8. }
  9. //票信息
  10. class Ticket {
  11.         private static int ticketid;

  12.         public static int getTicketid() {
  13.                 return ticketid;
  14.         }
  15.        
  16.         public static void setTicketid(int ticket) {
  17.                 ticketid = ticket;
  18.         }
  19. }
  20. //售票窗口
  21. class SealWindow implements Runnable {
  22.         private String ticketname;
  23.         TicketSealCenter tsc = null;;
  24.        
  25.         public SealWindow(String ticketname){
  26.                 this.ticketname = ticketname;
  27.                 tsc = TicketSealCenter.getInstance();
  28.         }
  29.         public void sellTicket(){
  30.        
  31.                 while(!tsc.hasTicket()){
  32.                         System.out.println(ticketname+"卖出了第" + tsc.getid()+"号票!");
  33.                         if (tsc.hasTicket()) {
  34.                                 System.out.println(ticketname+"的票已卖完!!");
  35.                         }
  36.                 }
  37.                
  38.         }
  39.         public void run() {
  40.                 sellTicket();
  41.         }
  42. }
  43. //售票中心
  44. class TicketSealCenter {
  45.         private static TicketSealCenter tsc = new TicketSealCenter();
  46.         private static Ticket ticket = new Ticket();
  47.        
  48.         private static int sumticket = 100;
  49.         private static boolean flag = false;
  50.        
  51.         private TicketSealCenter(){}
  52.        
  53.         public static TicketSealCenter getInstance(){
  54.                 return tsc;
  55.         }
  56.         //询问是否有票,设置票面ID,并返回该ID
  57.         public static synchronized boolean hasTicket(){
  58.                 if(sumticket > 0){
  59.                         ticket.setTicketid(sumticket);
  60.                         sumticket--;
  61.                 }else {
  62.                         flag =true;
  63.                 }
  64.                 return flag;
  65.         }
  66.         public int getid(){
  67.                 return ticket.getTicketid();
  68.         }
  69. }
复制代码



0 个回复

您需要登录后才可以回帖 登录 | 加入黑马