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

来源:互联网 发布:淘宝怎么激活支付宝 编辑:程序博客网 时间:2024/04/29 19:57
------------- android培训java培训、java博客、java学习型技术博客、期待与您交流! -------------
需求(略)思路1、需求简述客户拿号等着办理业务,业务窗口叫号为客户办理业务2、名次提炼找对象客户、号码、窗口、业务(隐性)3、简析对象客户:普通、快速、vip三种类型客户,可用枚举表示,不同客户有不同服务号码号码:三种客户需要分别服务,因而有三种号码,每个号码对应一个客户且按先后排序,      客户拿号和窗口叫号对应号码对象则提供两种方法窗口:普通、快速、vip三种类型窗口,不同类型窗口服务方式不一样,但都是按获取的号码依次提供服务业务:无需体现具体业务,可用随机方式设置办理业务时间4、对象关联客户-->明确服务类型-->获取该服务类型号码-->等待窗口叫号服务(明确类型,银行是通过一台机器客户在上面选择的方式完成)5、类的创建号码管理属性:下一个需要服务号码、装号码的集合行为:为客户产生新号码方法、无窗口提供下一个服务号码客户普通、快速、vip三种实例对象不同类型号码管理属性:普通、快速、vip三种类型号码管理行为:仅一个对象来明确需那种类型、三种生成号码管理的方法窗口属性:窗口类型、窗口编号方法:开始服务的方法,三种服务方法主函数类创建1、2、3、4号普通窗口,5号快速窗口,6号vip窗口创建3个线程分别来模拟生成三种客户且取相应的服务号码另定义一个常量类来装程序所需的常量
package cn.ithema.interview.bank1;import java.util.ArrayList;import java.util.List;public class NumberManager {//定义下一个所需服务号码private int lastNumber=1;//定义一个装号码的有序集合private List<Integer> queueNumber = new ArrayList<Integer>();//定义为客户生产新号码的方法public synchronized Integer generateNewNumber(){queueNumber.add(lastNumber);return lastNumber++;}//定义一个为窗口获取服务号码的方法,//因为取号叫号为多个线程控制,所以使用同步函数public synchronized Integer fetchNumber(){if(queueNumber.size()>0)return queueNumber.remove(0);return null;}}
package cn.ithema.interview.bank1;public class NumberMachine {//单例设计private static final NumberMachine instance = new NumberMachine();private NumberMachine(){}public static NumberMachine getInstance(){return instance;}//初始化三种号码管理private NumberManager commonManager = new NumberManager();private NumberManager expressManager = new NumberManager();private NumberManager vipManager = new NumberManager();//为客户提供选择取什么号码的号码管理器public NumberManager getCommonManager(){return commonManager;}public NumberManager getExpressManager(){return expressManager;}public NumberManager getVipManager(){return vipManager;}}
package cn.ithema.interview.bank1;public enum ClientType {COMMON,EXPRESS,VIP;public String toString() {switch(this){case COMMON:return "普通";case EXPRESS:return "快速";case VIP:return "vip";}return null;}}
package cn.ithema.interview.bank1;public class Constants {public static final int MAX_SERVICE_TIME = 10000;public static final int MIN_SERVICE_TIME = 1000;public static final int COMMON_CUSTOMER_INTERVAL_TIME = 1;}
package cn.ithema.interview.bank1;import java.util.Random;import java.util.concurrent.Executors;public class ServiceWindow {//定义窗口服务客户类型和窗口编号,并创建其set和get方法private int id;private ClientType type;public int getId() {return id;}public void setId(int id) {this.id = id;}public ClientType getType() {return type;}public void setType(ClientType type) {this.type = type;}//定义窗口启动服务方法,需要多线程循环执行public void start(){Executors.newSingleThreadExecutor().execute(new Runnable(){public void run() {while(true){switch(type){case COMMON:commonService();break;case EXPRESS:expressService();break;case VIP:vipService();break;}}}});}//为三种不同客户创建三种服务方法public void commonService(){//定义一个窗口名字String windowName = "<"+id+"号"+type+"窗口"+">";//获取服务号码Integer serviceNumber = NumberMachine.getInstance().getCommonManager().fetchNumber();//若号码有值则服务,若号码无值,则等待1sif(serviceNumber!=null){System.out.println(windowName+"开始获取普通客户服务任务");//随机产生服务时间,通过sleep方法实现服务时间int maxRandom = Constants.MAX_SERVICE_TIME - Constants.MIN_SERVICE_TIME;int serviceTime = new Random().nextInt(maxRandom)+1+Constants.MIN_SERVICE_TIME;try {Thread.sleep(serviceTime);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("*"+windowName+"已完成对第"+ serviceNumber +"号普通客户服务,总共用时:"+ serviceTime/1000 +"秒");}else{System.out.println(windowName+"没有需要服务的普通客户,等待1s后再发起服务");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}public void expressService(){String windowName = "<"+id+"号"+type+"窗口"+">";Integer serviceNumber = NumberMachine.getInstance().getExpressManager().fetchNumber();//若号码有值则服务,若号码无值,则服务普通客户if(serviceNumber!=null){System.out.println(windowName+"开始获取快速客户服务任务");//服务时间为最短时间,通过sleep方法实现服务时间int serviceTime = Constants.MIN_SERVICE_TIME;try {Thread.sleep(serviceTime);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("*"+windowName+"已完成对第"+ serviceNumber +"号快速客户服务,总共用时:"+ serviceTime/1000 +"秒");}else{System.out.println(windowName+"没有需要服务的快速客户");commonService();}}public void vipService(){String windowName = "<"+id+"号"+type+"窗口"+">";Integer serviceNumber = NumberMachine.getInstance().getVipManager().fetchNumber();//若号码有值则服务,若号码无值,则服务普通客户if(serviceNumber!=null){System.out.println(windowName+"开始获取vip客户服务任务");int maxRandom = Constants.MAX_SERVICE_TIME - Constants.MIN_SERVICE_TIME;int serviceTime = new Random().nextInt(maxRandom)+1+Constants.MIN_SERVICE_TIME;try {Thread.sleep(serviceTime);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("*"+windowName+"已完成对第"+ serviceNumber +"号vip客户服务,总共用时:"+ serviceTime/1000 +"秒");}else{System.out.println(windowName+"没有需要服务的vip客户");commonService();}}}
package cn.ithema.interview.bank1;import java.util.concurrent.Executors;import java.util.concurrent.TimeUnit;public class MainClass {public static void main(String[] args) {//1、2、3、4号普通窗口,5号快速窗口,6号vip窗口,并调用start方法for(int i=1;i<5;i++){ServiceWindow commonWindow = new ServiceWindow();commonWindow.setId(i);commonWindow.setType(ClientType.COMMON);commonWindow.start();}ServiceWindow expressWindow = new ServiceWindow();expressWindow.setId(1);expressWindow.setType(ClientType.EXPRESS);expressWindow.start();ServiceWindow vipWindow = new ServiceWindow();vipWindow.setId(6);vipWindow.setType(ClientType.VIP);vipWindow.start();//创建三个定时器,通过定期由NumberMachine按类型拿号来模拟客户拿号Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable(){public void run() {Integer serviceNumber = NumberMachine.getInstance().getCommonManager().generateNewNumber();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);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);}}






------------- android培训java培训、java博客、java学习型技术博客、期待与您交流! -------------
详情请查看:http://edu.csdn.net/heima/
0 0