银行业务调度系统
在银行业务调度系统中,每一个客户相当于一个号码;每进来一个客户就生成一个号码,每服务一个客户窗口就取一个号码;
所以可以用一个号码管理器来管理号码的生成与取出,建立一个号码管理器的类,提供生成号码和取出号码的方法,每生成一个号码就把它装进集合中,每取一个号码就将它从集合中取出第一个元素。
在整个系统中有三种服务类型,普通客户服务,快速客户服务,和VIP客户服务,它们分别在对应的服务窗口服务。所以要三个号码管理器,分别对这三种客户进行管理,用一个号码机器统一管理这三个号码管理器。整个系统张号码机器只有一个可以设计成单利,对外分别提供获取这三个号码管理器的方法。
服务窗口类,对外提供开始服务的方法,因为每种服务是独立运行的,所以要在该方法中创建线程,判断是什么客户类型即调用什么服务方法。
客户类型是固定的所以可用枚举表示
建立一个住方法,创建相应的窗口对象指定服务类型,调用窗口开始运行的方法。
创建三个定时器,按照比例随机的产生普通客户,快速客户,VIP客户。
用枚举表示三种客户类型
package com.itheima.bank; /*
三种客户类型用枚举表示
*/ public enum Customer { COMMON,QUIET,VIP; public String toString(){ switch(this){ case COMMON: return "普通"; case QUIET: return "快速"; case VIP: return "VIP"; } return null; } }
服务窗口以及应的服务
package com.itheima.bank; import java.util.Random; import java.util.concurrent.Executors; /* * 服务窗口为客户进行服务 * 实际上时窗口在调用对应的号码管理器对象叫号的过程。 * 每个窗口可以设置服务类型,即该设置该窗口为什么样的客户进行服务。 * 客户类型只有三种可以用枚举进行标示 * * */ public class serviceWindow { private int windowId=1; //服务类型 private Customer type=Customer.COMMON; public void setWindowId(int windowId) { this.windowId = windowId; } public void setType(Customer type) { this.type = type; } public void start(){ Executors.newSingleThreadExecutor().execute(new Runnable(){ /* (non-Javadoc) * @see java.lang.Runnable#run() */ @Override public void run() { while(true){ switch(type){ case COMMON: commonService(); break; case QUIET: quietService(); break; case VIP: vipService(); break; } } } }); } protected void vipService() { String windowName="第"+windowId+type+"窗口"; NumberManger numberManger=NumberMachine.getInstance().getCommonManger(); Integer number=numberManger.getNumber(); if(number!=null){ //System.out.println(windowName+"正在为第"+number+"号"+"VIP客户服务"); long begTime=System.currentTimeMillis(); try { Thread.sleep((new Random().nextInt(10)+1)*1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } long endTime=System.currentTimeMillis(); System.out.println(windowName+"为第"+number+"号"+"VIP客户服务完成"+",耗时"+(endTime-begTime)/1000+"s"); }else{ //System.out.println(windowName+"没有取到任务,,休息1s"); try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } commonService(); } } protected void quietService() { String windowName="第"+windowId+type+"窗口"; NumberManger numberManger=NumberMachine.getInstance().getCommonManger(); Integer number=numberManger.getNumber(); //System.out.println(windowName+"正在获取任务"); if(number!=null){ //System.out.println(windowName+"正在为第"+number+"号"+"快速客户服务"); long begTime=System.currentTimeMillis(); try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } long endTime=System.currentTimeMillis(); System.out.println(windowName+"为第"+number+"号"+"快速客户服务完成"+",耗时"+(endTime-begTime)/1000+"s"); }else{ //System.out.println(windowName+"没有取到任务,休息1s"); try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } commonService(); } } public void commonService() { String windowName="第"+windowId+type+"窗口"; NumberManger numberManger=NumberMachine.getInstance().getCommonManger(); Integer number=numberManger.getNumber(); if(number!=null){ //System.out.println(windowName+"正在为第"+number+"号"+"普通客户服务"); long begTime=System.currentTimeMillis(); try { Thread.sleep((new Random().nextInt(10)+1)*1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } long endTime=System.currentTimeMillis(); System.out.println(windowName+"为第"+number+"号"+"普通客户服务完成"+",耗时"+(endTime-begTime)/1000+"s"); }else{ //System.out.println(windowName+"没有取到任务,休息1s"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }
package com.itheima.bank; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; public class MainClass { public static void main(String[] args) { for(int i=1;i<=5;i++){ serviceWindow commonWindow=new serviceWindow(); commonWindow.setWindowId(i); commonWindow.setType(Customer.COMMON); commonWindow.start(); } serviceWindow vipWindow=new serviceWindow(); vipWindow.setType(Customer.VIP); vipWindow.start(); serviceWindow quietWindow=new serviceWindow(); quietWindow.setType(Customer.QUIET); quietWindow.start(); Executors.newScheduledThreadPool(1).scheduleAtFixedRate( new Runnable(){ @Override public void run() { Integer number=NumberMachine.getInstance().getQuietManger().creatNumber(); System.out.println("第"+number+"快速客户等待服务"); } }, 0, 3, TimeUnit.SECONDS); Executors.newScheduledThreadPool(1).scheduleAtFixedRate( new Runnable(){ @Override public void run() { Integer number=NumberMachine.getInstance().getVipManger().creatNumber(); System.out.println("第"+number+"号VIP客户等待服务"); } }, 0, 6, TimeUnit.SECONDS); Executors.newScheduledThreadPool(1).scheduleAtFixedRate( new Runnable(){ @Override public void run() { Integer number=NumberMachine.getInstance().getCommonManger().creatNumber(); System.out.println("第"+number+"普通客户等待服务"); } }, 0, 1, TimeUnit.SECONDS); } }
号码机器对号码管理器进行管理
package com.itheima.bank; /* * 号码机器,用于管理号码管理器 * 该系统中需要三个号码管理器分别对应普通窗口,快速窗口,VIP窗口。 * 各窗口调用自己的号码管理器对象取叫号。 * 在整个系统中号码管理器只有一个所以可以设计成单利 * * */ public class NumberMachine { private NumberMachine(){} private final static NumberMachine numberMachine=new NumberMachine(); public static NumberMachine getInstance() { return numberMachine; } private final static NumberManger commonManger=new NumberManger(); public NumberManger getCommonManger(){ return commonManger; } private final static NumberManger vipManger=new NumberManger(); public NumberManger getVipManger(){ return vipManger; } private final static NumberManger quietManger=new NumberManger(); public NumberManger getQuietManger(){ return quietManger; } }
package com.itheima.bank; import java.util.ArrayList; /* * 号码管理器用于生成号码,取出号码。 * 窗口为客户服务就是窗口调用对应的号码管理器叫号的过程。 * */ public class NumberManger { //定义集合用于存储号码管理器生成的号码 private ArrayList<Integer> numbers=new ArrayList<Integer>(); int num=1; public Integer creatNumber(){ numbers.add(num); return num++; } //获取号码的方法,从集合中取出第一个元素 public synchronized Integer getNumber(){ Integer number=null; if(numbers.size()>0){ number=numbers.remove(0); } return number; } }
---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------
浙公网安备 33010602011771号