黑马程序员技术交流社区

标题: 学银行调度系统的时候,关系有点乱,求大神帮忙屡屡 [打印本页]

作者: 葛奎    时间: 2012-11-21 20:18
标题: 学银行调度系统的时候,关系有点乱,求大神帮忙屡屡
package cn.itcast.bankqueue;

import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.logging.Logger;

public class MainClass {

private static Logger logger = Logger.getLogger("cn.itcast.bankqueue");

public static void main(String[] args) {
  //产生4个普通窗口
  for(int i=1;i<5;i++){
   ServiceWindow window =  new ServiceWindow();
   window.setNumber(i);
   window.start();
  }

  //产生1个快速窗口
  ServiceWindow expressWindow =  new ServiceWindow();
  expressWindow.setType(CustomerType.EXPRESS);
  expressWindow.start();
  
  //产生1个VIP窗口  
  ServiceWindow vipWindow =  new ServiceWindow();
  vipWindow.setType(CustomerType.VIP);
  vipWindow.start();  
  
  //普通客户拿号
  Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
    new Runnable(){
     public void run(){
      Integer serviceNumber = NumberMachine.getInstance().getCommonManager().generateNewNumber();
      /**
       * 采用logger方式,无法看到直观的运行效果,因为logger.log方法内部并不是直接把内容打印出出来,
       * 而是交给内部的一个线程去处理,所以,打印出来的结果在时间顺序上看起来很混乱。
       */
      //logger.info("第" + serviceNumber + "号普通客户正在等待服务!");
      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().generateNewNumber();
      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().generateNewNumber();
      System.out.println("第" + serviceNumber + "号VIP客户正在等待服务!");
     }
    },
    0,
    Constants.COMMON_CUSTOMER_INTERVAL_TIME * 6,
    TimeUnit.SECONDS);
}

}
//给了开启的窗口和用户拿完号之后,他们是怎么联系工作的,线程是怎么运转的?越详细越好  谢啦

作者: 王阳    时间: 2012-11-23 21:00
这个就不一定了,多个线程自动运行,至于联系工作,紧紧是因为NumberManager里面的两个方法被同步了,这也就保证了,再同一时间只会有一个线程进入,而且NumberMachine这个类里面是单例,并且封装了三个NumberManager对象,然后在窗口服务和主函数创建客户时分别调用了对应的方法,所以各个线程互不干涉,有则执行,没有则等待,不过如果是非普通窗口,等待结束后就会去调用普通窗口服务,获取普通客户,这个时候如果有则为普通客户服务,没有则继续等待,然后再次进入switch块里面,会再次跟进自己的类型调用自己的方法,如此循环下去




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