黑马程序员---银行业务调度系统

              银行调度管理系统

以下是张孝祥老师的银行调度系统,学习了此项目,我受益匪浅,有很多知识是平常很少接触的,在项目中能学到的,是你平常找不到的知识点,希望浏览此博客的游客,认真学习里面的知识点,多数代码本人都有注释,学起来很轻松

 

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();

}

}

 

posted @ 2013-03-14 16:24  杰的博客  阅读(172)  评论(0编辑  收藏  举报