java代码银行业务调度系统的简单实现。

程序实现银行业务调度系统:客户种类:普通,快速,VIP。窗口种类:4个普通窗口,1个快速窗口,1个VIP窗口。

业务逻辑类

  • 01

    首先创建一个类来模拟到银行的客户,我称之为客户模拟器。 package com.zyq.bank; import java.util.ArrayList; import java.util.List; /** * 客户模拟器 * @author zyq *时间:2016年11月25日下午10:44:34 * */ public class NumberManager { private int lastNumber=1; List<Integer> queueNumber=new ArrayList<Integer>(); //每次来一个银行客户产生一个新的号码 public synchronized Integer generateNewNumber(){ queueNumber.add(lastNumber); return lastNumber++; } //窗口每次叫到一个客户号就把此号从数组中移除 public synchronized Integer fetchServiceNumber(){ Integer number=null; if(queueNumber.size()>0){ queueNumber.remove(0); return lastNumber; } return number; } }

  • 02

    创建一个类模拟银行职员叫号:我称之为取号器。 package com.zyq.bank; /** * 取数模拟 * @author zyq *时间:2016年11月25日下午10:43:41 * */ public class NumberMachine { //三种客户类别:普通客户 ,快速客户,vip客户 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; } //单列 private NumberMachine(){} public static NumberMachine getInstance(){ return instance; } private static NumberMachine instance=new NumberMachine(); }

  • 03

    创建一个枚举类,表明三类客户。 package com.zyq.bank; /** * * 枚举类 *时间:2016年11月25日下午10:43:16 * */ public enum CustomerType { COMMON,EXPRESS,VIP; public String toString(){ switch(this){ case COMMON: return "普通"; case EXPRESS: return "快速"; case VIP: return name(); } return null; } }

  • 04

    创建一个常量类,方便时间记录。 package com.zyq.bank; /** * 常量类 *时间:2016年11月25日下午10:42:03 * */ public class Constants { public static int MIN_SERVICE_TIME=1000; public static int MAX_SERVICE_TIME=10000; public static int COMMON_CUSTOMER_INTERVIEW=1; }

  • 05

    新建类模拟银行职员服务:服务窗口。 package com.zyq.bank; import java.util.Random; import java.util.concurrent.Executors; /** * 服务窗口 * @author zyq *时间:2016年11月25日下午10:46:56 * */ public class ServiceWindow { private CustomerType type=CustomerType.COMMON; private int windowId =1; /***** 此处设置set方法而不是有参数的构造方法 方便复用 ********/ public void setType(CustomerType type) { this.type = type; } public void setWindowId(int windowId) { this.windowId = windowId; } public void star() { //此处jdk5以后记忆 仅建立一个线程池 获取客户号 Executors.newSingleThreadExecutor().execute(new Runnable() { public void run() { while(true){ //亦可以用if 但是没有switvh效率高 switch(type){ case COMMON: commonService(); break; case EXPRESS: expressService(); break; case VIP: vipService(); break; } } } }); } private void commonService() { String windowName="第"+ windowId +"号"+type+"窗口"; System.out.println(windowName+"正在获取普通任务"); Integer number=NumberMachine.getInstance().getCommonManager().fetchServiceNumber(); if(number != null){ System.out.println(windowName+"正在为"+number+"普通客户服务"); long beginTime=System.currentTimeMillis(); int maxRandom=Constants.MAX_SERVICE_TIME-Constants.MIN_SERVICE_TIME; //产生【1000,10000】的随机数   模拟服务的时间 long serveTime=new Random().nextInt(maxRandom)+1+Constants.MIN_SERVICE_TIME; try { Thread.sleep(serveTime); } catch (InterruptedException e) { e.printStackTrace(); } //服务消耗的时间 long costTime=System.currentTimeMillis()-beginTime; System.out.println(windowName+"为第"+number+"号普通客户服务"+",耗时"+costTime/1000 +"秒"); }else{ System.out.println(windowName+"没有取到任务,先休息一下喝口水"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } private void expressService() { Integer number=NumberMachine.getInstance().getExpressManager().fetchServiceNumber(); String windowName="第"+ windowId +"号" +type +"窗口"; System.out.println(windowName+"正在获取快速任务"); if(number != null){ System.out.println(windowName+"正在为"+number+"号"+type+"快速客户服务"); long beginTime=System.currentTimeMillis(); //int maxRandom=Constants.MAX_SERVICE_TIME-; //产生【1000,10000】的随机数   模拟服务的时间 //long serveTime=new Random().nextInt(maxRandom)+1+Constants.MIN_SERVICE_TIME; try { Thread.sleep(Constants.MIN_SERVICE_TIME); } catch (InterruptedException e) { e.printStackTrace(); } //服务消耗的时间 long costTime=System.currentTimeMillis()-beginTime; System.out.println(windowName+"为第"+number+"号"+type+"客户服务"+costTime/1000 +"秒"); }else{ System.out.println(windowName+"没有取到任务,继续为普通客户服务"); commonService(); } } private void vipService() { Integer number=NumberMachine.getInstance().getCommonManager().fetchServiceNumber(); String windowName="第"+ windowId +"号" +type +"窗口"; System.out.println(windowName+"正在获取VIP任务"); if(number != null){ System.out.println(windowName+"正在为"+number+"号"+type+"客户服务"); long beginTime=System.currentTimeMillis(); int maxRandom=Constants.MAX_SERVICE_TIME-Constants.MIN_SERVICE_TIME; //产生【1000,10000】的随机数   模拟服务的时间 long serveTime=new Random().nextInt(maxRandom)+1+Constants.MIN_SERVICE_TIME; try { Thread.sleep(serveTime); } catch (InterruptedException e) { e.printStackTrace(); } //服务消耗的时间 long costTime=System.currentTimeMillis()-beginTime; System.out.println(windowName+"为第"+number+"号"+type+"客户服务"+costTime/1000 +"秒"); }else{ System.out.println(windowName+"没有取到任务,继续为普通用户服务,就别喝水了"); commonService(); } } }

测试代码类

  • 01

    写一个测试类来测试代码的准确性。 package com.zyq.bank; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; /** * 测试类 * @author zyq *时间:2016年11月25日下午11:48:37 * */ public class MainClass { public static void main(String[] args) { //产生4个普通窗口 for (int i = 1; i < 5; i++) { ServiceWindow commonWindow=new ServiceWindow(); commonWindow.setWindowId(i); commonWindow.star(); } //产生一个快速窗口 ServiceWindow expressWindow=new ServiceWindow(); expressWindow.setType(CustomerType.EXPRESS); expressWindow.star(); //产生一个VIP窗口 ServiceWindow vipWindow=new ServiceWindow(); vipWindow.setType(CustomerType.VIP); vipWindow.star(); //普通客户拿号 Executors.newScheduledThreadPool(1).scheduleAtFixedRate( new Runnable() { public void run() { Integer number=NumberMachine.getInstance().getCommonManager().generateNewNumber(); System.out.println(number+"号普通客户正在等待服务"); } }, 0, Constants.COMMON_CUSTOMER_INTERVIEW, TimeUnit.SECONDS ); //快速客户拿号 Executors.newScheduledThreadPool(1).scheduleAtFixedRate( new Runnable() { public void run() { Integer number=NumberMachine.getInstance().getExpressManager().generateNewNumber(); System.out.println(number+"号快速客户正在等待服务"); } }, 0, Constants.COMMON_CUSTOMER_INTERVIEW * 6, TimeUnit.SECONDS ); //VIP客户拿号 Executors.newScheduledThreadPool(1).scheduleAtFixedRate( new Runnable() { public void run() { Integer number=NumberMachine.getInstance().getVipManager().generateNewNumber(); System.out.println(number+"号VIP客户正在等待服务"); } }, 0, Constants.COMMON_CUSTOMER_INTERVIEW * 2, TimeUnit.SECONDS ); } }

  • 02

    测试结果如下: 第1号普通窗口正在获取普通任务 第1号普通窗口没有取到任务,先休息一下喝口水 第2号普通窗口正在获取普通任务 第2号普通窗口没有取到任务,先休息一下喝口水 第3号普通窗口正在获取普通任务 第3号普通窗口没有取到任务,先休息一下喝口水 第4号普通窗口正在获取普通任务 第4号普通窗口没有取到任务,先休息一下喝口水 第1号VIP窗口正在获取VIP任务 第1号VIP窗口没有取到任务,继续为普通用户服务,就别喝水了 第1号VIP窗口正在获取普通任务 第1号VIP窗口没有取到任务,先休息一下喝口水 第1号快速窗口正在获取快速任务 第1号快速窗口没有取到任务,继续为普通客户服务 第1号快速窗口正在获取普通任务 第1号快速窗口没有取到任务,先休息一下喝口水 1号普通客户正在等待服务 1号快速客户正在等待服务 1号VIP客户正在等待服务 第1号普通窗口正在获取普通任务 第1号普通窗口正在为2普通客户服务 第1号快速窗口正在获取快速任务 》》一直运行中....

(0)

相关推荐

  • Java代码for循环实现九九乘法口诀

    Java小知识,利用Java代码for循环实现九九乘法口诀 操作方法 01 这个真实技术活,不信,一般人还真不会,所以今天就来说一说其中的步骤和所需要的工具 1.IDE(一般是使用eclipse,当然 ...

  • java代码实现二维码的生成和解析

    2015年什么最火,二维码,2016年随处可见的是什么,二维码.二维码的历史我们就不探究了,今天分享的是利用Java代码实现二维码的生成和解析.Java代码生成和解析二维码涉及到的东西比较多,还需要引 ...

  • 如何用java代码实现选择排序和冒泡排序

    冒泡排序和选择排序是排序算法中比较简单和容易实现的算法.冒泡排序的思想为:每一次排序过程,通过相邻元素的交换,将当前没有排好序中的最大(小)移到 数组的最右(左)端.而选择排序的思想也很直观:每一次排 ...

  • java代码中怎么实现代码的换行

    在我们编程java代码的时候,总是需要使用换行的代码,所以今天就由小编来为大家介绍java代码中怎么实行代码的换行. 操作方法 01 第一首先在电脑上打开eclipse软件. 然后再写一个IO流的Fi ...

  • Notepad++直接编译运行java代码

    Notepad++拥有强大的插件管理能力,可以集成并实现很多的功能,利用NppExec插件可以实现直接编译运行java代码的功能,下面就介绍下方法 操作方法 01 打开Notepad++,在工具栏中找 ...

  • 十条规则编写格式优美的Java代码

    操作方法 01 作为程序员在进行编码时,一定会十分小心注意编码的格式,简单明了,才不至于在出现错误时难以查找,本文介绍了十条规则,让你编写出"优美"的代码来.    最近在做应用的 ...

  • win10系统下简单两步轻松将回收站锁定到任务栏上的技巧

    回收站是微软Windows操作系统里的其中一个系统文件夹,主要用来存放用户临时删除的文档资料,而Win10预览版相比之前的Windows系统版本,有了一些较大的改变,比如可以将回收站锁定到任务栏,这样 ...

  • 还原win7系统的简单方法

    还原win7系统的简单方法: 1. 首先在开始菜单中打开控制面板,打开控制面板之后,在控制面板的众多选择项中打开备份和还原选项; 2.然后在接下来的界面中选择恢复系统设置和计算机.如果你的计算机没有开 ...

  • java代码两种常见的执行方法

    java代码两种常见的执行方法详细说明 操作方法 01 打开eclipse开发环境(可以用其他的开发环境人员MyEclipse等) 02 创建或者打开一个java project 新建一个java文件 ...