黑马程序员技术交流社区

标题: 银行系统运行出错的问题(急) [打印本页]

作者: 孔肖    时间: 2012-9-27 11:49
标题: 银行系统运行出错的问题(急)
这是三个取号的代码。运行时出现了null号。。。这是怎么回事呢?
//普通客户拿号
  Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
    new Runnable(){
     public void run(){
      Integer serviceNumber = NumberMachine.getInstance().getCommonManager().getServiceNumber();
           System.out.println("第" + serviceNumber + "号普通客户正在等待服务!");      
     }
    },
    0,
    Constants.COMMON_CUSTOMER_INTERVAL_TIME,
    TimeUnit.SECONDS);
  
  //快速客户拿号
  Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
    new Runnable(){
     public void run(){
      Integer serviceNumber = NumberMachine.getInstance().getExpressManager().getServiceNumber();
      System.out.println("第" + serviceNumber + "号快速客户正在等待服务!");
     }
    },
    0,
    Constants.COMMON_CUSTOMER_INTERVAL_TIME * 2,
    TimeUnit.SECONDS);
  
  //VIP客户拿号
  Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
    new Runnable(){
     public void run(){
      Integer serviceNumber = NumberMachine.getInstance().getVipManager().getServiceNumber();
      System.out.println("第" + serviceNumber + "号VIP客户正在等待服务!");
     }
    },
    0,
    Constants.COMMON_CUSTOMER_INTERVAL_TIME * 6,
    TimeUnit.SECONDS);

2.jpg (1.29 KB, 下载次数: 20)

2.jpg

1.jpg (8.25 KB, 下载次数: 17)

1.jpg

作者: 赵永康    时间: 2012-9-27 13:19
getServiceNumber();
是怎么定义的??
作者: 孔肖    时间: 2012-9-27 14:22
赵永康 发表于 2012-9-27 13:19
getServiceNumber();
是怎么定义的??

获取号码是这样定义的
public synchronized Integer getServiceNumber()
        {
                if(queueNumber.size()>0)
                        return queueNumber.remove(0);
                else
                        return null;
        }
作者: 覃宏海    时间: 2012-9-27 16:44
public synchronized Integer fetchServiceNumber(){
                if(queueNumber.size()>0){---------------------------------在这里应该要先进行判断!如果有号码才取,你没进行判断,线程先运行的是取号的动作,但这时还没有号码
                return queueNumber.remove(0);
                }
                return null;
        }
作者: 叶征东    时间: 2012-9-27 22:06
本帖最后由 叶征东 于 2012-9-27 22:08 编辑

  public synchronized Integer getNewManager(){//---------这个方法是用于客户取号的,取号的同时,也将客户加入到队列中.
        queuenNumber.add(lastNumber);
        return lastNumber++;
}

public synchronized Integer fetchServiceNumber(){//------这个方法是用于窗口取号的,
          if (queuenNumber.size()>0) {//------先判断是否有客户在排队
                 return queuenNumber.remove(0);//-----有的话就能给队中的第一个客户服务,并把这个客户从队列中删除.
           } else {
                return null;
          }


楼主在客户取号的调用的是fetchServiceNumber(),这是用于窗口取号的.
在编译时没有错,但是在逻辑上是有误的,应该是先有客户在排队,窗口才有可能有为客户服务.



我也犯过和你一样的错,呵.




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