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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 孔肖 中级黑马   /  2012-9-27 11:49  /  1658 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

这是三个取号的代码。运行时出现了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

评分

参与人数 1技术分 +1 收起 理由
王海宇 + 1

查看全部评分

4 个回复

倒序浏览
getServiceNumber();
是怎么定义的??
回复 使用道具 举报
赵永康 发表于 2012-9-27 13:19
getServiceNumber();
是怎么定义的??

获取号码是这样定义的
public synchronized Integer getServiceNumber()
        {
                if(queueNumber.size()>0)
                        return queueNumber.remove(0);
                else
                        return null;
        }
回复 使用道具 举报
public synchronized Integer fetchServiceNumber(){
                if(queueNumber.size()>0){---------------------------------在这里应该要先进行判断!如果有号码才取,你没进行判断,线程先运行的是取号的动作,但这时还没有号码
                return queueNumber.remove(0);
                }
                return null;
        }

评分

参与人数 1技术分 +1 收起 理由
王海宇 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 叶征东 于 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(),这是用于窗口取号的.
在编译时没有错,但是在逻辑上是有误的,应该是先有客户在排队,窗口才有可能有为客户服务.



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

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马