黑马程序员---银行业务调度系统
银行调度管理系统
以下是张孝祥老师的银行调度系统,学习了此项目,我受益匪浅,有很多知识是平常很少接触的,在项目中能学到的,是你平常找不到的知识点,希望浏览此博客的游客,认真学习里面的知识点,多数代码本人都有注释,学起来很轻松
1.创建用户服务窗口
package com.csdn.interview.bank;
public class CreateWindow {
public void getWindow() {
//创建五个普通用户窗口
for (int i = 1; i < 5; i++) {
ServiceWindow commonServiceWindow = new ServiceWindow();// 创建普通服务窗口
commonServiceWindow.setWindowID(i);// 给服务窗口编号
commonServiceWindow.startGetNumber();// 服务窗口开始获取任务
}
ServiceWindow speedServiceWindow = new ServiceWindow();// 创建快速服务窗口
speedServiceWindow.setClientType(ClientType.SpeedClient);// 给快速窗口设置服务客户类型
speedServiceWindow.startGetNumber();
ServiceWindow vipServiceWindow = new ServiceWindow();// 创建VIP服务窗口
vipServiceWindow.setClientType(ClientType.VipClient);
vipServiceWindow.startGetNumber();
}
}
2.创建客户类型
package com.csdn.interview.bank;
public enum ClientType {
CommonClient,SpeedClient,VipClient;
public String toString()
{
//this代表当前类的 clienttype
switch (this) {
case CommonClient:
return "普通客户";
case SpeedClient:
return "快速客户";
case VipClient:
return name();//返回当前类型
}
return null;
}
}
3.创建客户
package com.csdn.interview.bank;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
public class CreateClient {
private static final int timer = 1;// 每一秒钟产生一个普通客户
public void getClient(){
//普通客户
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable() {
public void run() {
Integer number=GetNumberMachine.getInstance().getCommonClient().clientGetNumber();//普通客户开始取号、
System.out.println("第"+number+"号普通客户正在等待服务");
}
}, 0, 1, TimeUnit.SECONDS);
//快速客户
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable() {
public void run() {
Integer number=GetNumberMachine.getInstance().getSpeedClient().clientGetNumber();//普通客户开始取号、
System.out.println("第"+number+"号快速客户正在等待服务");
}
}, 0, timer * 6, TimeUnit.SECONDS);
//VIP客户
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable() {
public void run() {
Integer number=GetNumberMachine.getInstance().getVipClient().clientGetNumber();//普通客户开始取号、
System.out.println("第"+number+"号VIP客户正在等待服务");
}
}, 0,timer*12, TimeUnit.SECONDS);
}
4.创建银行取号机器
package com.csdn.interview.bank;
public class GetNumberMachine {
private NumberManager commonClient = new NumberManager();//普通客户服务窗口
private NumberManager speedClient = new NumberManager();//快速窗口
private NumberManager vipClient = new NumberManager();//vip窗口
public NumberManager getCommonClient() {
return commonClient;
}
public void setCommonClient(NumberManager commonClient) {
this.commonClient = commonClient;
}
public NumberManager getSpeedClient() {
return speedClient;
}
public void setSpeedClient(NumberManager speedClient) {
this.speedClient = speedClient;
}
public NumberManager getVipClient() {
return vipClient;
}
public void setVipClient(NumberManager vipClient) {
this.vipClient = vipClient;
}
private GetNumberMachine(){
}
//这是单列设计模式,构造方法是私有的的,就要用静态,返回一取号机实例,也就是一个号码管理器
public static GetNumberMachine getInstance()
{
return machine;
}
private static GetNumberMachine machine=new GetNumberMachine();//私有的构造方法就自己创建一个取号机,供别人使用
}
5.号码管理器
package com.csdn.interview.bank;
import java.util.ArrayList;
import java.util.List;
public class NumberManager {
private int number=1;
private List<Integer> sequenceNumber=new ArrayList<Integer>();//创建一个客户存储服务号数组
//客户取号
public synchronized Integer clientGetNumber()
{
sequenceNumber.add(number);
return number++;
}
//服务窗口去服务号
public synchronized Integer windowGetServiceNumber()
{
if (sequenceNumber.size()>0) {
return sequenceNumber.remove(0);//窗口每次取号都从数组的第一个取号
}
return null;
}
}
6.服务窗口
package com.csdn.interview.bank;
import java.util.Random;
import java.util.concurrent.Executors;
public class ServiceWindow {
private ClientType clientType=ClientType.VipClient ;
private int windowID = 1;// 服务窗口默认号
public void setClientType(ClientType clientType) {
this.clientType = clientType;
}
public void setWindowID(int windowID) {
this.windowID = windowID;
}
// 服务窗口开始取号
public void startGetNumber() {
// 这就话就是取号窗口把任务分配给线程池,线程池在吧任务分配给某个线程
Executors.newSingleThreadExecutor().execute(new Runnable() {
@Override
public void run() {
while (true) {
switch (clientType) {
case CommonClient:
commonServiceWindow();
break;
case SpeedClient:
speedServiceWindow();
break;
case VipClient:
vipServiceWindow();
break;
}
}
}
});
}
//VIP服务窗口
private void vipServiceWindow() {
String winName="第" + windowID + "号"+ clientType + "窗口";
// 服务窗口通过取号机获取服务的客服号
Integer number = GetNumberMachine.getInstance().getVipClient().windowGetServiceNumber();
System.out.println(winName+"正在获取服务对象");
if (number != null) {
long begintime = System.currentTimeMillis();
try {
Thread.sleep((new Random().nextInt(10) + 1)*1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
long endtiem = System.currentTimeMillis();
System.out.println(winName+"为第" + number + "号"+ clientType + "服务" + (endtiem - begintime)/ 1000 + "秒");
} else {
System.out.println("没有要服务的vip客户");
commonServiceWindow();//如果vip窗口没有服务对象,就给普通客户服务
}
}
//快速服务窗口
private void speedServiceWindow() {
String winName="第" + windowID + "号"+clientType+"窗口";
// 服务窗口通过取号机获取服务的客服号
Integer number = GetNumberMachine.getInstance().getSpeedClient().windowGetServiceNumber();
System.out.println(winName+"正在获取服务对象");
if (number != null) {
long begintime = System.currentTimeMillis();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
long endtiem = System.currentTimeMillis();
System.out.println(winName+"为第" + number + "号"+ clientType + "服务" + (endtiem - begintime)/ 1000 + "秒");
} else {
System.out.println("没有要服务的客户");
commonServiceWindow();//如果快速窗口没有服务对象,就给普通客户服务
}
}
//普通客户服务窗口
private void commonServiceWindow() {
String winName="第" + windowID + "号"+ clientType + "窗口";
// 服务窗口通过取号机获取服务的客服号
Integer number = GetNumberMachine.getInstance()
.getCommonClient().windowGetServiceNumber();
System.out.println(winName+"正在获取服务对象");
if (number != null) {
long begintime = System.currentTimeMillis();
try {
Thread.sleep(((new Random().nextInt(10)) + 1)*1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
long endtiem = System.currentTimeMillis();
System.out.println(winName+"为第" + number + "号"+ "普通客户"+ "服务" + (endtiem - begintime)/ 1000 + "秒");
} else {
System.out.println("没有你要服务的客户");
try {
Thread.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
7.主程序,检验此程序是否能合格运行
package com.csdn.interview.bank;
public class Main {
public static void main(String[] args) {
//创建银行服务窗口
new CreateWindow().getWindow();
//创建客户
new CreateClient().getClient();
}
}