银行业务调度系统

设计思路:

(1)有三种对应类型的客户:VIP客户,普通客户,快速客户,异步随机生成各种类型的客户,各类型客户在其对应窗口按顺序依次办理业务。

(2)有三个类。NumberManager类,NumberMachine类,Serverwindow类(抽象类,有三个子类

(一)NumberMachinery类

   1.NumberManage对象总共有三个,由NumberMachinery控制,所以定义成三个成员变量。

   2.NumberMachinery是唯一的,所以使用单例设计。

代码如下: 

public class Numbermachinery {/**该类使用单例设计模式*使用饿汉式      */private Numbermachinery(){}private static final Numbermachinery numberMacInstance = new Numbermachinery();private static Numbermanager com = new Numbermanager();private static Numbermanager exp = new Numbermanager();private static Numbermanager vip = new Numbermanager();     public static Numbermachinery getInstance(){return numberMacInstance;}public Numbermanager commonNumber(){return  com;}public Numbermanager expressNumber(){return  exp;}public Numbermanager vipNumber(){return vip;}
}

 (二)NumberManager类 

有两个方法:generateNumber()产生号码,fetchNunber()对外提供获取号码的方法。 

  1.因为要频繁的增删,所有使用LinkedList集合。 

  2.两个方法都涉及不同的线程,所以要实现同步。 

  3.对于获取null号码,为避免空指针,让它返回-1 

代码如下:  

import java.util.LinkedList;
public class Numbermanager {/**两个方法。* 一个产生号码,一个提供外界对号码的访问     * */int num=0;     
  //存储号码的容器
LinkedList<Integer> link = new LinkedList<Integer>();
//产生号码的方法 public synchronized int numberGenerate() { link.offerLast(++num); return num; } //提供获取号码的方法 public synchronized Integer fetchNumber(){ Integer num = link.pollFirst(); if(num==null){ return -1; } else{ return num; } } }

(三)Numbertype 枚举类
    1.将三种类型的客户用一个枚举类来表示,非常方便,其中定义的三个成员分别表示三种类型的客户。
    2.覆盖toString方法,返回类型的中文名称。

代码如下:

package bankdemo;public enum Numbertype {COMMON,EXPRESS,VIP;public String toString(){if(this==Numbertype.COMMON){return "普通";}if(this==Numbertype.EXPRESS){return "快速";}elsereturn "VIP";         }
}

 

(四)ServerWindow类。

 因为三个类有共同的功能但是功能主体不同,所以抽取父类,让这三个类继承。考虑到现实中,普通窗口可以随时变成VIP窗口和快速窗口。也可以定义成一个类,三个方法。 

  1.三个类继承抽象类。

  2.内被定义一个线程,让三个窗口实现轮流叫号。

  3.抽象方法用于显示信息,和耗时的计算。

代码如下:

import java.util.Random;
import java.util.concurrent.Executors;
public abstract class Serverwindow {public  Numbertype type= Numbertype.COMMON;public  int windowId=1; public String windowName;public void setType(Numbertype type){ this.type=type;}public void setWindowId(int windowId){this.windowId=windowId;     }     public void windowServer() {Executors.newSingleThreadExecutor().execute(new Runnable(){             public  void run(){//注意while循环的放置位置,要在一个线程run方法中。                 while(true){                 try {Thread.sleep(1000);} catch (InterruptedException e2) {                         e2.printStackTrace();}                     Integer num = getNum();windowName = windowId+ "号" + type + "窗口";try {Thread.sleep(1500);} catch (InterruptedException e1) {                     e1.printStackTrace();}if (num == -1) {print1();                         helpWindow();} else {                 print2(num);                         long start = System.currentTimeMillis();                     long serverTime = getServerTime();try {                            Thread.sleep(serverTime);                         } catch (InterruptedException e) {e.printStackTrace();}long end = System.currentTimeMillis();print3(num, end - start);}}}                              });        }     public abstract void print1();//显示没有获取到任务的信息,public abstract void print2(int num);//显示开始服务的信息public abstract void print3(int num,long time);//显示服务的时间的信息public abstract void helpWindow();//快速窗口和VIP窗口对普通窗口服务public abstract long getServerTime();//服务时间public abstract int getNum();//获取号码
}class CommonServerWindow extends Serverwindow{        public void print1(){System.out.println( windowName+"没有获取到普通客户服务>>>>>");System.out.println(windowName + "休息1秒");try {Thread.sleep(1000);} catch (InterruptedException e) {                             e.printStackTrace();}}    public void print2(int num){System.out.println( windowName+"获取到"+num+"号普通服务,开始服务");}    public void print3(int num,long time){System.out.println( windowName+"为"+num+"号普通客户服务完毕,耗时"+time+"秒");}    public void helpWindow(){        }     public long getServerTime() {     long serverTime =new Random().nextInt((ConstantDemo.MAX-ConstantDemo.MIN)/1000)+1;return serverTime*1000+ConstantDemo.MIN;}      public int getNum() {     return   Numbermachinery.getInstance().commonNumber().fetchNumber();}
} class ExpressServerWindow extends Serverwindow{     public void print1() {    System.out.println(windowName+"没有获取到快速客户服务》》》");    System.out.println(windowName + "休息1秒");}     public void print2(int num) {         System.out.println(windowName+"获取到"+num+"号快速服务,开始服务");} public void print3(int num, long time) {         System.out.println(windowName+"为"+num+"号.快速客户服务完毕,耗时"+time+"秒");}public void helpWindow() {    //快速窗口为普通客户服务 CommonServerWindow cs=new CommonServerWindow();cs.setType(Numbertype.EXPRESS);cs.setWindowId(1);cs.windowServer();              }     public long getServerTime() {     return ConstantDemo.MIN;} public int getNum() {         return  Numbermachinery.getInstance().expressNumber().fetchNumber();}    
}
class VIPServerWindow extends Serverwindow{     public void print1() {System.out.println(windowName+"没有获取到VIP客户服务");    System.out.println(windowName + "休息1秒");}     public void print2(int num) {System.out.println(windowName+"获取到"+num+"号VIP服务,开始服务");        }public void print3(int num, long time) {System.out.println(windowName+"为"+num+"号..VIP客户服务完毕,耗时"+time+"秒");    }     public void helpWindow() {//VIP窗口为普通客户服务 CommonServerWindow cs=new CommonServerWindow();cs.setType(Numbertype.VIP);cs.setWindowId(1);cs.windowServer();      }     public long getServerTime() {         return ConstantDemo.MAX;} public int getNum() {return  Numbermachinery.getInstance().vipNumber().fetchNumber();}}

(五)常量的类  

public class ConstantDemo { public static final int MAX=3000;public static final int MIN=1000;          
}

(六)mian方法。

  1.使用for循环,产生四个普通窗口。而快速窗口和VIP窗口,设定为只有一个窗口。

  2.使用Executors线程工具类,产生三个单独的线程,进行产生号码。

import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit; 
public class MainDemo {     public static void main(String[] args) {//设置4个普通窗口        for(int x=1;x<5;x++){                CommonServerWindow commonwindow  = new CommonServerWindow();//new 4次
                commonwindow.setWindowId(x);commonwindow.setType(Numbertype.COMMON);                commonwindow.windowServer();             }            Serverwindow expresswindow = new ExpressServerWindow();expresswindow.setType(Numbertype.EXPRESS);expresswindow.windowServer();VIPServerWindow vipwindow=  new VIPServerWindow();vipwindow.setType(Numbertype.VIP);vipwindow.windowServer();Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable(){         public void run() {Integer num = Numbermachinery.getInstance().commonNumber().numberGenerate();if(num!=null){                    System.out.println("普通客户"+num+"号等待服务");}                }            } ,0, 1,TimeUnit.SECONDS);Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable(){         public void run() {Integer num =Numbermachinery.getInstance().expressNumber().numberGenerate();;if(num!=null){                    System.out.println("快速客户"+num+"号等待服务");}                    }            } ,0, 4,TimeUnit.SECONDS);Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable(){         public void run() {Integer num = Numbermachinery.getInstance().vipNumber().numberGenerate(); if(num!=null){                    System.out.println("VIP客户"+num+"号等待服务");}                    }            } ,0, 7,TimeUnit.SECONDS);    }
}

 

 

 

 

转载于:https://www.cnblogs.com/heimaprogramer/p/3768170.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/299658.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

我已经把它摸的透透的了!!!Spring 动态数据源设计实践,全面解析

[ Spring 动态数据源 动态数据源是什么&#xff1f;它能解决什么&#xff1f;&#xff1f;&#xff1f; 在实际的开发中&#xff0c;同一个项目中使用多个数据源是很常见的场景。比如&#xff0c;一个读写分离的项目存在主数据源与读数据源。 所谓动态数据源&#xff0c;就…

EF Core 异步编程注意要点

????欢迎点赞 &#xff1a;???? 收藏 ⭐留言 ???? 如有错误敬请指正&#xff0c;赐人玫瑰&#xff0c;手留余香&#xff01;????本文作者&#xff1a;由webmote 原创&#xff0c;????作者格言&#xff1a;生活在于折腾&#xff0c;当你不折腾生活时&#x…

AJAX+JavaScript无刷新检查用户名

AJAXJavaScript无刷新检查用户名是否可用2009-04-20 16:26 JavaScript 和 Ajax 代码<script language"javascript" type"text/javascript">var xmlHttp null; function createXMLHttp() { if(window.ActiveXObject) …

Cisco路由器密码恢复

Cisco路由器密码恢复1、必需先用终端方式接CONSOLE口&#xff0c;进入终端状态&#xff1b;2、开路由器电源&#xff1b;3、在60秒内&#xff0c;按Ctrl Break键&#xff0c;中断路由器的启动进程&#xff0c;使其进入ROM监控模式&#xff0c;提示符为"rommon >"或…

看电影的第一大禁忌 | 今日最佳

全世界只有3.14 % 的人关注了青少年数学之旅&#xff08;图源网络&#xff0c;侵权删&#xff09;

C++经典面试题

1、int a5&#xff0c;则 (a)的值是&#xff08;&#xff09; A、5 B、 6 C、7 D、逻辑错误a返回的是一个暂时变量&#xff0c;这里是右值&#xff0c;不能再前面了2、以下的代码输出什么&#xff1f;&#xff08;取地址运算符比运算符的优先级要高&…

求职华为,被问观察者模式,从没有这种体验!!!

求职华为&#xff0c;被问观察者模式&#xff0c;从没有这种体验&#xff01;&#xff01;&#xff01;模式的定义与特点模式的结构与实现1. 模式的结构2. 模式的实现模式的应用实例模式的应用场景模式的扩展1. Observable类2. Observer 接口[ 观察者模式可以说是非常贴近我们…

SQL2005的配置

最近迷上c#&#xff0c;下午装好了SQL server management studio Express 附加经典的northwind数据库 然后用下面一段代码测试 1usingSystem;2usingSystem.Collections.Generic;3usingSystem.Text;4usingSystem.Data;5usingSystem.Data.Sql;6usingSystem.Data.SqlClient;78name…

为什么应该用record来定义DTO(续)

前言上次&#xff0c;我们介绍了因为DTO的“不变性”&#xff0c;应该用record来定义DTO。今天&#xff0c;我们来说明用record来定义DTO的另一个好处。问题首先&#xff0c;我们实现一个Controler&#xff0c;代码如下:[ApiController] [Route("[controller]")] pub…

字节、编码、字符、字符集 专题

1.2 字符&#xff0c;字节&#xff0c;字符串 理解编码的关键&#xff0c;是要把字符的概念和字节的概念理解准确。这两个概念容易混淆&#xff0c;我们在此做一下区分&#xff1a; 概念描述举例字符人们使用的记号&#xff0c;抽象意义上的一个符号。1, 中, a, $, &#xffe5…

资料分享 | 数学建模竞赛备战大全

全世界只有3.14 % 的人关注了青少年数学之旅目前针对数学建模的认知&#xff0c;绝大部分人还停留在数学建模竞赛阶段&#xff0c;并不知道数学建模是数据领域非常重要的一种方法。数学建模涉及的内容广泛&#xff0c;比如碎纸片问题中所涉及的图像识别及神经网络、小区开放问题…

TC的文件拷贝/移动

在EX当中&#xff0c;我们比较常用的拷贝/移动文件/目录的方式就是先进行文件/目录定位&#xff0c;然后按CtrlC,Ctrlx&#xff0c;然后在移动到目标目录&#xff0c;再按Ctrlv&#xff0c;通过拷贝/剪切和粘贴的方式进行。文件在拷贝/过程当中只有一个对话框显示当前进度&…

初级Java开发工程师!绝密文档,面试手册全面突击!!!秋招已经到来

这里我要明说一下&#xff0c;不是Java初级和学习Java的千万不要乱看&#xff0c;否则~~~~ 你会怀疑人生&#xff0c;因为会浪费你时间啊&#xff01;&#xff01;&#xff01; 本次考点是Java初级开发工程师面试必备的一些东西!!! 1、数据类型 基本类型 byte/8、short/16、…

数学2600年,欧拉凭什么能当上“大王”?

全世界只有3.14 % 的人关注了青少年数学之旅何为数学&#xff1f;♠音乐家说&#xff0c;数学是世界上最和谐动听的音符♥植物学家说&#xff0c;世界上没有比数学更美的花朵♣美学家说&#xff0c;哪里有数学&#xff0c;哪里才有真正的美♦哲学家说&#xff0c;世界什么都在变…

NET流行高性能JSON框架-Json.NET

在日常编程中经常会使用到Json来进行数据的交互好在.Net平台下有很多开源的Json库使得我们能够比较轻松快速的处理各种复杂的Json&#xff0c;其中Newtonsoft库是NET的流行高性能JSON框架特性工具VS2010Newtonsoft库从NuGet下载合适的Newtonsoft.Json库1.在你需要引用Newtosoft…

Tcpdump 详解

TcpDump可以将网络中传送的数据包的“头”完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的过滤&#xff0c;并提供and、or、not等逻辑语句来帮助你去掉无用的信息。和Linux终端状态下的其他软件一样&#xff0c;TcpDump也是依靠参数来工作&#xff0c;本文将…

敢叫岁月不冬天

敢叫岁月不冬天题记&#xff1a;观看人民公园千菊会有感——代腾飞 2009年11月21日 于成都绿柳成荫似境仙秋菊满园锦上添红黄白紫竞展颜要留秋月不冬天转载于:https://www.cnblogs.com/daitengfei/archive/2009/11/22/1607976.html

Scribefire发CSDN博客

历史在非常久非常久曾经&#xff0c;CSDN是支持外部工具来写文章的&#xff0c;但是在还有一个非常久非常久曾经就不行了。突然看到CSDN有能够用外部工具来写博客了&#xff08;CSDN的公告&#xff09;&#xff0c;一直以来都纠结这个问题&#xff0c;CSDN的编辑器不好用&#…

今日笔记!——分析Java应用性能

1 问题描述 因产品架构的复杂性&#xff0c;可能会导致性能问题的因素有很多。根据部署架构&#xff0c;大致的可以分为应用端瓶颈、数据库端瓶颈、环境瓶颈三大类。可以根据瓶颈的不同部位&#xff0c;选择相应的跟踪工具进行跟踪分析。 应用层面瓶颈大致有如下两类&#xf…

除了PS,还有它可以轻松实现图像处理!

全世界只有3.14 % 的人关注了青少年数学之旅在我们生活中&#xff0c;常见的图像处理软件有Adobe Photoshop、Adobe Illustrator等。然而&#xff0c;并非只有软件才能实现图像处理&#xff0c;通过编程手段也是能实现的&#xff01;今天&#xff0c;小天将要带着大家走进计算机…