黑马程序员-银行业务调度系统

  ------- <a  target="blank">android培训</a>、<a  target="blank">java培训</a>、期待与您交流! ----------
/**
   * 银行业务调度系统
   *
   * 银行内有6个业务窗口,1 - 4号窗口为普通窗口,5号窗口为快速窗口,6号窗口为VIP窗口。
   * 有三种对应类型的客户:VIP客户,普通客户,快速客户(办理如交水电费、电话费之类业务的客户)。
   * 异步随机生成各种类型的客户,生成各类型用户的概率比例为:
   * VIP客户 :普通客户 :快速客户 = 1 :6 :3。
   * 客户办理业务所需时间有最大值和最小值,在该范围内随机设定每个VIP客户以及普通客户办理业务所需的时间,快速客户办理业务所需时间为最小值(提示:办理业务的过程可通过线程Sleep的方式模拟)。
   * 各类型客户在其对应窗口按顺序依次办理业务。
   * 当VIP(6号)窗口和快速业务(5号)窗口没有客户等待办理业务的时候,这两个窗口可以处理普通客户的业务,而一旦有对应的客户等待办理业务的时候,则优先处理对应客户的业务。
   * 随机生成客户时间间隔以及业务办理时间最大值和最小值自定,可以设置。
   * 不要求实现GUI,只考虑系统逻辑实现,可通过Log方式展现程序运行结果。
   *
   * 思路分析:
   * 1,客户来了,取号排队,找的是取号的机器;生成的号码应该有VIP,快速和普通三种类型,是不是需要3个取号机器呢?平常,银行里只有一个取号的机器,
   * 于是就想到可以搞一个号码管理器类,产生3个实例对象统一由取号的机器管理。
   * 2,创建一个取号的机器,因为对象只有一个,要设计成单例模式,提供获取对应号码管理器类的对象方法。
   * 3,创建一个号码管理器类,谁有数据=谁就提供方法,要提供一个取号的方法,不管你是什么类的客户号码,都有取号的方法。
   * 属性有什么呢?
   * 要有一个存储号码的集合,搞到这里,后面服务窗口怎么知道要叫哪个号码服务,肯定是问号码管理器,谁有数据=谁就提供方法,还要有个提供下一个服务信息号码的方法。
   * 4,创建窗口类,属性很简单有两个,一个编号,一个类型就可以。
   * 窗口做什么?服务客户,不断找号码管理器的方法获得下一个服务号码,有就开始服务。
   * 5,主函数,创建窗口的实例对象,并对其配置编号和类型,再用3个线程产生客户,就是调用号码管理器的取号方法。
   *
   *
   * 总结:
   * 1,刚刚首分析程序显示的结果,一直没有快速窗口为普通客户服务的情况,可是找到了VIP窗口给普通客户服务的情况,我坚信程序没问题。
   * 运行了很久还是碰不到我想要的情况,最最后减少了几个普通窗口的数量,这样普通客户的服务就会相对变得紧张,其他窗口空闲时获取到普通客户的概率就很大大增加,果然一下子就看到了我想要的结果。
   * 2,首先还是看了张老师讲解才会做的,之前只能开个门,无法分析其中的面向对象之间的关系,之后再写的过程中也是遇到过问题,主要的核心应该就是NumberMachine和NumberManager这两
   * 个类的理解,开始我真是分析不出来。就连张孝祥老师也说这是一种境界之后的领悟,我还差的很远呢。
   * 3,再者,对Servicewindow类也蛮有感悟,感觉一下子对面向对象又有了一个新的理解,新的提升,你看,服务窗口,都有两个基本属性,编号和类型。
   * 这是他们的共同点。还有NumberManager类,有三个对象,都有取号和返回下一个服务号码的功能。不管是ServiceWindow还是NumberManager,他们的实例对象的资源都是独立的,能这样去
   * 做设计恐怕这就是传说中的面向对象的思想设计模式吧。
   */

package com.itcast.interview.bankqueue;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
public class MainClass {
 public static void main(String[] args) {

  // 创建4个普通窗口
  for (int i = 1; i < 5; i++) {
   ServiceWindow commonWindow = new ServiceWindow();
   commonWindow.setType(CustomerType.COMMON);
   commonWindow.setNumber(i);
   commonWindow.start();
  }
  // 创建一个快速窗口
  ServiceWindow experssWindow = new ServiceWindow();
  experssWindow.setNumber(5);
  experssWindow.setType(CustomerType.EXPERSS);
  experssWindow.start();
  // 创建一个VIP窗口
  ServiceWindow vipWindow = new ServiceWindow();
  vipWindow.setNumber(6);
  vipWindow.setType(CustomerType.VIP);
  vipWindow.start();
  // 每一秒出现一位普通客户
  Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable() {
   public void run() {
    int serviceNumber = NumberMachine.getInstance()
      .getCommonManager().generateNumber();
    System.out.println(serviceNumber + "号普通客户正在等待服务中");
   }
  }, 0, 1, TimeUnit.SECONDS);
  // 每2秒出现一位快速客户
  Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable() {
   public void run() {
    int serviceNumber = NumberMachine.getInstance()
      .getExperssManager().generateNumber();
    System.out.println(serviceNumber + "号快速客户正在等待服务中");
   }
  }, 0, 2, TimeUnit.SECONDS);
  // 每6秒出现一位VIP客户
  Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable() {
   public void run() {
    int serviceNumber = NumberMachine.getInstance()
      .getVipManager().generateNumber();
    System.out.println(serviceNumber + "号VIP客户正在等待服务中");
   }
  }, 0, 6, TimeUnit.SECONDS);
 }
}
==================================================================================
package com.itcast.interview.bankqueue;
public class NumberMachine {
 /* 单例模式创建一个取号机器实例对象 */
 private NumberMachine() {
 }
 private static NumberMachine instance = new NumberMachine();
 public static NumberMachine getInstance() {
  return instance;
 }
 /* 创建三个号码管理器引用对象 */
 private NumberManager commonManager = new NumberManager();
 private NumberManager experssManager = new NumberManager();
 private NumberManager vipManager = new NumberManager();
 /* 提供获取号码管理器的方法 */
 public NumberManager getCommonManager() {
  return commonManager;
 }
 public NumberManager getExperssManager() {
  return experssManager;
 }
 public NumberManager getVipManager() {
  return vipManager;
 }
}
===========================================================================
package com.itcast.interview.bankqueue;
import java.util.ArrayList;
import java.util.List;
public class NumberManager {
 private Integer lastNumber = 0;
 private List<Integer> queueNumbers = new ArrayList<Integer>();
 // 客户取号
 public synchronized Integer generateNumber() {
  queueNumbers.add(++lastNumber);
  return lastNumber;
 }
 // 提供下一个服务号码
 public synchronized Integer fetchNumber() {
  if (queueNumbers.size() > 0)
   return queueNumbers.remove(0);
  else
   return null;
 }
}
=================================================================
package com.itcast.interview.bankqueue;
import java.util.Random;
import java.util.concurrent.Executors;
public class ServiceWindow {
 // 窗口两个属性:窗口编号,窗口的类型
 private int number = 1;
 private CustomerType type = CustomerType.COMMON;
 public void setType(CustomerType type) {
  this.type = type;
 }
 public void setNumber(int number) {
  this.number = number;
 }
 public CustomerType getType() {
  return this.type;
 }
 public void start() {
  Executors.newSingleThreadExecutor().execute(new Runnable() {
   public void run() {
    while (true) {
     switch (type) {
     case COMMON:
      commonService();
      break;
     case EXPERSS:
      experssService();
      break;
     case VIP:
      vipService();
      break;
     }
    }
   }
  });
 }
 // 普通服务窗口
 private void commonService() {
  String windowName = "第" + number + "号" + type + "窗口";
  System.out.println(windowName + "正在获取普通任务");
  Integer serviceNumber = NumberMachine.getInstance().getCommonManager()
    .fetchNumber();
  if (serviceNumber != null) {
   System.out.println(windowName + "获取到了" + "第" + serviceNumber
     + "号普通任务");
   int maxRandom = Constant.MAX_SERVICE_TIME
     - Constant.MIN_SERVICE_TIME;
   int serviceTime = new Random().nextInt(maxRandom)
     + Constant.MIN_SERVICE_TIME;
   try {
    Thread.sleep(serviceTime);
   } catch (InterruptedException e) {
   }
   System.out.println(windowName + "为" + "第" + serviceNumber
     + "号普通客户服务结束,------------->耗时" + serviceTime + "秒");
  } else {
   System.out.println(windowName + "没有获取到普通任务,先休息1秒嘛!");
   try {
    Thread.sleep(1000);
   } catch (InterruptedException e) {
   }
  }
 }
 // 快速服务窗口
 private void experssService() {
  String windowName = "第" + number + "号" + type + "窗口";
  System.out.println(windowName + "正在获取快速任务");
  Integer serviceNumber = NumberMachine.getInstance().getExperssManager()
    .fetchNumber();
  if (serviceNumber != null) {
   System.out.println(windowName + "获取到了" + "第" + serviceNumber
     + "号快速任务");
   int serviceTime = Constant.MIN_SERVICE_TIME;
   try {
    Thread.sleep(serviceTime);
   } catch (InterruptedException e) {
   }
   System.out.println(windowName + "为" + "第" + serviceNumber
     + "号快速客户服务结束,------------->耗时" + serviceTime + "秒");
  } else {
   System.out.println(windowName + "没有获取到快速任务");
   commonService();
  }
 }
 // VIP服务窗口
 private void vipService() {
  String windowName = "第" + number + "号" + type + "窗口";
  System.out.println(windowName + "正在获取VIP任务");
  Integer serviceNumber = NumberMachine.getInstance().getVipManager()
    .fetchNumber();
  if (serviceNumber != null) {
   System.out.println(windowName + "获取到了" + "第" + serviceNumber
     + "号VIP任务");
   int maxRandom = Constant.MAX_SERVICE_TIME
     - Constant.MIN_SERVICE_TIME;
   int serviceTime = new Random().nextInt(maxRandom)
     + Constant.MIN_SERVICE_TIME;
   try {
    Thread.sleep(serviceTime);
   } catch (InterruptedException e) {
   }
   System.out.println(windowName + "为" + "第" + serviceNumber
     + "号VIP客户服务结束,------------->耗时" + serviceTime + "秒");
  } else {
   System.out.println(windowName + "没有获取到VIP任务");
   commonService();
  }
 }
}
============================================================================
package com.itcast.interview.bankqueue;
public enum CustomerType {
 COMMON, EXPERSS, VIP;
 public String toString() {
  switch (this) {
  case COMMON:
   return "普通";
  case EXPERSS:
   return "快速";
  case VIP:
   return "VIP";
  }
  return null;
 }
}

=============================================================================
package com.itcast.interview.bankqueue;
public class Constant
{
 static int MAX_SERVICE_TIME=10;
 static int MIN_SERVICE_TIME=1;

}
==========================================================================
LOG
第1号普通窗口正在获取普通任务
第6号VIP窗口正在获取VIP任务
第5号快速窗口正在获取快速任务
第1号普通窗口没有获取到普通任务,先休息1秒嘛!
第5号快速窗口没有获取到快速任务
第5号快速窗口正在获取普通任务
第5号快速窗口没有获取到普通任务,先休息1秒嘛!
第6号VIP窗口没有获取到VIP任务
第6号VIP窗口正在获取普通任务
第6号VIP窗口没有获取到普通任务,先休息1秒嘛!
1号普通客户正在等待服务中
1号快速客户正在等待服务中
1号VIP客户正在等待服务中
第6号VIP窗口正在获取VIP任务
第6号VIP窗口获取到了第1号VIP任务
第5号快速窗口正在获取快速任务
第5号快速窗口获取到了第1号快速任务
第1号普通窗口正在获取普通任务
第1号普通窗口获取到了第1号普通任务
2号普通客户正在等待服务中
第5号快速窗口为第1号快速客户服务结束,------------->耗时1秒
第5号快速窗口正在获取快速任务
第5号快速窗口没有获取到快速任务
第5号快速窗口正在获取普通任务
第5号快速窗口获取到了第2号普通任务
第1号普通窗口为第1号普通客户服务结束,------------->耗时7秒
第1号普通窗口正在获取普通任务
第1号普通窗口没有获取到普通任务,先休息1秒嘛!
第5号快速窗口为第2号普通客户服务结束,------------->耗时8秒
第5号快速窗口正在获取快速任务
第5号快速窗口没有获取到快速任务
第5号快速窗口正在获取普通任务
第5号快速窗口没有获取到普通任务,先休息1秒嘛!
第6号VIP窗口为第1号VIP客户服务结束,------------->耗时9秒
第6号VIP窗口正在获取VIP任务
第6号VIP窗口没有获取到VIP任务
第6号VIP窗口正在获取普通任务
第6号VIP窗口没有获取到普通任务,先休息1秒嘛!
3号普通客户正在等待服务中
2号快速客户正在等待服务中
第1号普通窗口正在获取普通任务
第1号普通窗口获取到了第3号普通任务
第5号快速窗口正在获取快速任务
第5号快速窗口获取到了第2号快速任务
第6号VIP窗口正在获取VIP任务
第6号VIP窗口没有获取到VIP任务
第6号VIP窗口正在获取普通任务
第6号VIP窗口没有获取到普通任务,先休息1秒嘛!
第5号快速窗口为第2号快速客户服务结束,------------->耗时1秒
第5号快速窗口正在获取快速任务
第5号快速窗口没有获取到快速任务
第5号快速窗口正在获取普通任务
第5号快速窗口没有获取到普通任务,先休息1秒嘛!
第1号普通窗口为第3号普通客户服务结束,------------->耗时9秒
第1号普通窗口正在获取普通任务
第1号普通窗口没有获取到普通任务,先休息1秒嘛!
4号普通客户正在等待服务中
第6号VIP窗口正在获取VIP任务
第6号VIP窗口没有获取到VIP任务
第6号VIP窗口正在获取普通任务
第6号VIP窗口获取到了第4号普通任务
第5号快速窗口正在获取快速任务
第5号快速窗口没有获取到快速任务
第5号快速窗口正在获取普通任务
第5号快速窗口没有获取到普通任务,先休息1秒嘛!
第6号VIP窗口为第4号普通客户服务结束,------------->耗时6秒
第6号VIP窗口正在获取VIP任务
第6号VIP窗口没有获取到VIP任务
第6号VIP窗口正在获取普通任务
第6号VIP窗口没有获取到普通任务,先休息1秒嘛!
第1号普通窗口正在获取普通任务
第1号普通窗口没有获取到普通任务,先休息1秒嘛!
5号普通客户正在等待服务中
3号快速客户正在等待服务中
第5号快速窗口正在获取快速任务
第5号快速窗口获取到了第3号快速任务
第5号快速窗口为第3号快速客户服务结束,------------->耗时1秒
第5号快速窗口正在获取快速任务
第5号快速窗口没有获取到快速任务
第5号快速窗口正在获取普通任务
第5号快速窗口获取到了第5号普通任务
第6号VIP窗口正在获取VIP任务
第6号VIP窗口没有获取到VIP任务
第6号VIP窗口正在获取普通任务
第6号VIP窗口没有获取到普通任务,先休息1秒嘛!
第5号快速窗口为第5号普通客户服务结束,------------->耗时2秒
第5号快速窗口正在获取快速任务
第5号快速窗口没有获取到快速任务
第5号快速窗口正在获取普通任务
第5号快速窗口没有获取到普通任务,先休息1秒嘛!
第1号普通窗口正在获取普通任务
第1号普通窗口没有获取到普通任务,先休息1秒嘛!
6号普通客户正在等待服务中
第6号VIP窗口正在获取VIP任务
第6号VIP窗口没有获取到VIP任务
第6号VIP窗口正在获取普通任务
第6号VIP窗口获取到了第6号普通任务
第5号快速窗口正在获取快速任务
第5号快速窗口没有获取到快速任务
第5号快速窗口正在获取普通任务
第5号快速窗口没有获取到普通任务,先休息1秒嘛!
第1号普通窗口正在获取普通任务
第1号普通窗口没有获取到普通任务,先休息1秒嘛!
第6号VIP窗口为第6号普通客户服务结束,------------->耗时4秒
第6号VIP窗口正在获取VIP任务
第6号VIP窗口没有获取到VIP任务
第6号VIP窗口正在获取普通任务
第6号VIP窗口没有获取到普通任务,先休息1秒嘛!
7号普通客户正在等待服务中
4号快速客户正在等待服务中
2号VIP客户正在等待服务中
第5号快速窗口正在获取快速任务
第5号快速窗口获取到了第4号快速任务
第5号快速窗口为第4号快速客户服务结束,------------->耗时1秒
第5号快速窗口正在获取快速任务
第5号快速窗口没有获取到快速任务
第5号快速窗口正在获取普通任务
第5号快速窗口获取到了第7号普通任务
第1号普通窗口正在获取普通任务
第1号普通窗口没有获取到普通任务,先休息1秒嘛!
第6号VIP窗口正在获取VIP任务
第6号VIP窗口获取到了第2号VIP任务
第5号快速窗口为第7号普通客户服务结束,------------->耗时4秒
第5号快速窗口正在获取快速任务
第5号快速窗口没有获取到快速任务
第5号快速窗口正在获取普通任务
第5号快速窗口没有获取到普通任务,先休息1秒嘛!
第6号VIP窗口为第2号VIP客户服务结束,------------->耗时5秒
第6号VIP窗口正在获取VIP任务
第6号VIP窗口没有获取到VIP任务
第6号VIP窗口正在获取普通任务
第6号VIP窗口没有获取到普通任务,先休息1秒嘛!


------- <a  target="blank">android培训</a>、<a  target="blank">java培训</a>、期待与您交流! ----------

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值