java基础--简单银行业务调度系统

来源:互联网 发布:ps软件破解版下载 编辑:程序博客网 时间:2024/06/05 02:29

一共存在六个类,分别是NumberManager,NumberMachine,CustomerType,Constants,ServiceWindow,Cilent;

NumberManager类:用于管理号码的类,该类提供两个方法,获取客户号码,生成客户号码,该类里面有一个List类型的成员变量queueNumbers用于模拟银行的客户队列,当调用生成号码generateNewNumber方法就往集合中增加一个元素并且放回添加的元素,集合默认是增加到集合的最后面,当调用获取号码fetchNumber方法时,获取到给集合的第一个元素,然后将其删除并且放回该删除的元素,这样就得到了正在办理业务的号码,并且以实现了办理完业务过后该顾客就不再队列中了。为了防止并发所以以synchronized关键字分别修饰这连个方法。


NumberMachine类:一个产生各种类型的号数的机器,由于号数机器只能存在一个所以将其设为单列模式。为了得到各个种类的号数。所以该类中拥有三个NumberManager类型的引用变量,分别将其变量名取为:commonManager, expressManager, vipManager一次代表为普通,快速,vip;这样就实现了三个种类的号码管理类了。但是我们要获得号码管理类,所以还要为其提供,get方法,getCommonManager、getExpressManager、getVipManager。


CustomerType类:这个类是一个枚举类。定义了三个枚举实例为:COMMON,EXPRESS,VIP;分别表示类型为 普通,快速,vip;为了增加显示效果,从写了该枚举类的toString。


Constants类:这个类型对简单,类中定义了三个常量MIN_SERVICE_TIME、MAX_SERVICE_TIME、COMMON_CUSTOMER_INTERVAL_TIME,分别表示:完成业务最短时间、完成业务最大时间、普通客户增加的间隔时间。

ServiceWindow类:用于操作个个窗口的业务。有连个成员变量,一个是顾客类型,一个是窗口号数。初始化分别为普通类型和1号窗口。还提供了一个start()方法和处理三种业务的方法commonService、expressService、vipService,start()方法用于启动窗口的办理业务的服务:方法中有一个线程,处理业务的线程,里面用swtich语句区分各个类型的窗口,由于处理业务一直都在进行,所以在siwtch语句的各个类型的分支后面都存在一个无线循环的语句。里面分别执行当前类型的服务方法。服务方法里,执行的其实就是如果有排队的客户,就会办理该客户的业务。


Cilent类:主函数类,要想实现银行系统,所以先要生成四个普通的窗口。一但窗口存在就会执行业务,所以生成一个窗口服务对象,因为普通窗口有四个所以要改变窗口的好数并且马上调用start方法。然后生成快速服务和vip服务的窗口。现在各个窗口都等待客户来了,所以接下来要分别提供各种类型的窗口的客户了。并且客户要具有一定周期性的不断产生所以我们就把,这三种类型的客户分别写入独立的一个线程中去。并且要周期性的执行所以所用了scheduleAtFixedRate()方法。


具体实现代码:

①.

package>//客户对应的号数
private>//模拟客户的队列。
private List<Integer> queueNumbers =>}
//设置窗口号数
public>}
//启动窗口的服务
public>{
System.out.println(windowName + "开始为第" +>{
System.out.println(windowName + "开始为第" +>{
System.out.println(windowName + "开始为第" + serviceNumber + "号vip客户服务");
int>int>try
{
//办理业务的时间
Thread.sleep(serviceTime);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
System.out.println(windowName + "完成为第" + serviceNumber + "号vip客户服务,总共耗时" + serviceTime / 1000 + "秒");
}
else
{
//如果vip窗口没有vip客户来办理业务,这现在vip就会为普通客户服务
System.out.println(windowName + "还没取到vip任务");
//vip窗口获取普通客户
commonService();
}
}
}


⑥.

package com.itheima.study.bank;


import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;


public class Cilent
{
public static void main(String[] args)
{
//产生四个普通窗口,一但窗口存在就开始为客户服务
for(int>{
ServiceWindow>window.setNumber(i);
//窗口一旦存在就为客户服务
window.start();
}
//产生快速窗口,为客户服务
ServiceWindow>expressWindow.setType(CustomerType.EXPRESS);
//开始为快速客户服务
expressWindow.start();
//产生vip窗口
ServiceWindow>vipWindow.setType(CustomerType.VIP);
//开始为vip客户服务
vipWindow.start();
//创建一个周期性的线程池,该池中只有一个线程用于处理普通业务,每隔1秒增加1个普通客户人员号码。
//scheduleAtFixedRate(Runnable command, long initialDelay,long period,TimeUnit unit);方法接收四个参数分别是 
//command - 要执行的任务 , initialDelay - 首次执行的延迟时间  , period - 连续执行之间的周期
// unit - initialDelay 和 period 参数的时间单位 
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
new Runnable(){
public void run()
{
//获取普通客户的号码数
Integer>System.out.println("第" + serviceNumber + "普通客户正在等待服务!");
}
}, 
0, 
Constants.COMMON_CUSTOMER_INTERVAL_TIME, 
TimeUnit.SECONDS
);

//创建一个周期性的线程池,该池中只有一个线程用于处理快速业务,每隔2秒增加一个快速客户人员号码。
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
new Runnable(){
public void run()
{
Integer>System.out.println("第" + serviceNumber + "快速客户正在等待服务!");
}
}, 
0, 
Constants.COMMON_CUSTOMER_INTERVAL_TIME * 2, 
TimeUnit.SECONDS
);
//创建一个周期性的线程池,该池中只有一个线程用于处理vip业务,每隔6秒增加一个vip客户人员号码。
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
new Runnable(){
public void run()
{
Integer>System.out.println("第" + serviceNumber + "号vip客户正在等待服务!");
}
}, 
0, 
Constants.COMMON_CUSTOMER_INTERVAL_TIME * 6, 
TimeUnit.SECONDS
);
}
}