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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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);
}

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

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

1 个回复

倒序浏览
这个就不一定了,多个线程自动运行,至于联系工作,紧紧是因为NumberManager里面的两个方法被同步了,这也就保证了,再同一时间只会有一个线程进入,而且NumberMachine这个类里面是单例,并且封装了三个NumberManager对象,然后在窗口服务和主函数创建客户时分别调用了对应的方法,所以各个线程互不干涉,有则执行,没有则等待,不过如果是非普通窗口,等待结束后就会去调用普通窗口服务,获取普通客户,这个时候如果有则为普通客户服务,没有则继续等待,然后再次进入switch块里面,会再次跟进自己的类型调用自己的方法,如此循环下去
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马