黑马程序员_张孝祥7K面试题——银行调度系统学习随感

  -------<a href="http://www.itheima.com/"">android培训</a>、<a   href="http://www.itheima.com/" ">java培训</a>期待与您交流!----------

 

                             黑马程序员_银行调度系统学习随感

 

学习了张孝祥老师的面试题——银行调度系统的视频。感受到了张老师的编程功力,也很受启发。张老师根据实际生活中银行中的实际工作流程,运用了面向对象的思想编写了这个系统。分别定义了CustomerType,NumberMachine,NumberManager,ServiceWindow。分别定义了实际生活中 客户,银行取号机,取号机里面的号码管理器,银行服务窗口。在整个系统中各个类各尽其责,从而使整个系统良好运行起来。

CustomerType枚举,定义了三种客户。

NumberMachine类,负责取出每种客户的号码。

NumberManager类,负责添加新的客户号码提供给窗口,和删除以服务好的客户号码。

ServiceWindow,负责加号,服务客户。

但这个系统的编写我也有自己的思路。当然我知道自己的设计跟张老师的设计比,差很多,但是

最重要的是积累编程经验嘛。尤其是对面向对象的程序设计思想感悟也更深刻了。

我的思路是,定义了一个DisPathSystem类。我称之为整个系统的业务逻辑控制类。内部运用多线程技术,该类负责为每个银行服务窗口分配需要服务的客户号码。

又定义了窗口,客户号码生产器,客户等类。这些类的定义思路与张老师的相似。

当我编好自己的银行调度系统,再去看张老师的视频,就会发现自己的设计有一个很大缺点,就是与实际很不相符。DisPathSystem类的定义就有些牵强,徐然在逻辑上说的通,但并没有很好的运用面向对象思想设计程序。是整个系统的逻辑有一些牵强。至于程序的安全性,扩展性,可维护性,自是不必说。

下面是自己的程序代码,及程序运行结果。

package com.baidu.interview;

 

public enum Couster {

VIP("VIP客户"),

GEREN("普通客户"),

FAST("快速业务客户");

public String name;

private Couster(String name){

this.name=name;

}

@Override

public String toString() {

// TODO Auto-generated method stub

return name;

}

}

 

 

package com.baidu.interview;

 

import java.util.LinkedList;

import java.util.Random;

import java.util.concurrent.Executors;

import java.util.concurrent.TimeUnit;

 

/*

 * 本类用不断按比例生成三种客户装进各自集合队列里。

 */

public class CoursterQuence {

private LinkedList<Integer> Generic = new LinkedList<Integer>();

private LinkedList<Integer> Vip = new LinkedList<Integer>();

private LinkedList<Integer> Fast = new LinkedList<Integer>();

private int genericNO = 0;

private int VipNO = 0;

private int FastNO = 0;

 

public LinkedList<Integer> getGeneric() {

return Generic;

}

 

public LinkedList<Integer> getVip() {

return Vip;

}

 

public LinkedList<Integer> getFast() {

return Fast;

}

 

public void createCouster() {

// 生成普通客户将其放入集合队列中

Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable() {

@Override

public void run() {

// TODO Auto-generated method stub

 

Generic.offerLast(++genericNO);

System.out.println("新增" + genericNO + "号普通业务客户");

}

}, 0, 1, TimeUnit.SECONDS);

// 生成快速业务客户将其放入集合队列中

Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable() {

@Override

public void run() {

// TODO Auto-generated method stub

Fast.offerLast(++FastNO);

System.out.println("新增" + FastNO + "号快速业务客户");

}

}, 0, 3, TimeUnit.SECONDS);

// 生成VIP客户将其放入集合队列中

Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable() {

@Override

public void run() {

// TODO Auto-generated method stub

Vip.offerLast(++VipNO);

System.out.println("新增" + VipNO + "号VIP客户");

}

}, 0, 6, TimeUnit.SECONDS);

}

//该方法用于向窗口提供要被服务的客户号码

public synchronized Integer getGenericNO() {

Integer NO = null;

if (Generic.size() > 0) {

NO = Generic.removeFirst();

}

return NO;

}

 

public synchronized Integer getVipNO() {

Integer NO = null;

if (Vip.size() > 0) {

NO = Vip.removeFirst();

}

return NO;

}

//删除以服务好的客户号码。

public synchronized Integer getFastNO() {

Integer NO = null;

if (Fast.size() > 0) {

NO = Fast.removeFirst();

}

return NO;

}

}

 

package com.baidu.interview;

 

import java.util.LinkedList;

import java.util.Random;

//本类实现三种窗口获取客户号码为客户服务。

public class DispathSystem {

private CoursterQuence quence;

// 定义三种服务窗口。

private LinkedList<BankWindow> genericList = new LinkedList<BankWindow>();

private BankWindow VipWindow = new BankWindow("VIP窗口", 5);

private BankWindow FastWindow = new BankWindow("快速业务窗口", 6);

 

public DispathSystem(CoursterQuence quence) {

// TODO Auto-generated constructor stub

this.quence = quence;

for (int i = 0; i < 5; i++) {

genericList.add(new BankWindow("普通业务窗口", i + 1));

}

 

}

 

// 普通窗口获取客户

public void genericGetCouster() {

new Thread() {

LinkedList<Integer> list = quence.getGeneric();

 

@Override

public void run() {

while (true) {

for (int i = 0; i < 5; i++) {

BankWindow bw = genericList.get(i);

if (!bw.isBusy && list.size() > 0) {

Integer NO = quence.getGenericNO();

if(NO!=null)

System.out.println(bw + "取出" + NO + "号普通客户为其服务");

bw.isBusy = true;

genericList.offerLast(bw);

genericList.removeFirst();

bw.work();

if (!bw.isBusy) {

System.out.println(bw + "空闲中等待服务客户");

}

}

}

}

};

}.start();

}

 

// Vip窗口获取客户

public void getVipCouster() {

new Thread() {

LinkedList<Integer> listVip = quence.getVip();

LinkedList<Integer> list = quence.getGeneric();

 

@Override

public void run() {

while (true) {

System.out.print("");

//如有VIP客户且该窗口空闲,VIP窗口取出VIP客户为其服务

if (listVip.size() > 0 && !VipWindow.isBusy) {

Integer NO = quence.getVipNO();

if(NO!=null)

System.out

.println(VipWindow + "取出" + NO + "号VIP客户为其服务");

VipWindow.isBusy = true;

try {

Thread.sleep((new Random().nextInt(5)) * 1000);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

VipWindow.isBusy = false;

}

//如没有VIP客户且该窗口空闲,VIP窗口取出普通客户为其服务

if (listVip.size() == 0 && list.size() > 0

&& !VipWindow.isBusy) {

Integer NO = quence.getGenericNO();

if(NO!=null)

System.out.println(VipWindow + "取出" + NO + "号普通客户为其服务");

VipWindow.isBusy = true;

try {

Thread.sleep((new Random().nextInt(4)) * 1000);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

VipWindow.isBusy = false;

System.out.println("VIP窗口服务好客户,空闲中等待服务客户");

if (!VipWindow.isBusy) {

System.out.println(VipWindow + "空闲着等待服务客户");

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

 

}

};

}.start();

}

 

// 快速业务窗口获取客户。

public void getFastCouster() {

new Thread() {

LinkedList<Integer> listFast = quence.getFast();

LinkedList<Integer> list = quence.getGeneric();

 

@Override

public void run() {

while (true) {

//如有快速业务客户且该窗口空闲,快速业务窗口取出快速业务客户为其服务

if (listFast.size() > 0 && !FastWindow.isBusy) {

Integer NO = quence.getFastNO();

if(NO!=null)

System.out.println(FastWindow + "取出" + NO

+ "号快速业务客户为其服务");

FastWindow.isBusy = true;

try {

Thread.sleep((new Random().nextInt(2)) * 1000);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

FastWindow.isBusy = false;

}

//如没有快速业务客户且该窗口空闲,快速业务窗口取出普通业务客户为其服务

if (listFast.size() == 0 && list.size() > 0

&& !FastWindow.isBusy) {

Integer NO = quence.getGenericNO();

if(NO!=null)

System.out

.println(FastWindow + "取出" + NO + "号普通客户为其服务");

FastWindow.isBusy = true;

try {

Thread.sleep((new Random().nextInt(2)) * 1000);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

FastWindow.isBusy = false;

System.out.println(FastWindow + "窗口服务好客户,空闲中等待服务客户");

}

if (!FastWindow.isBusy) {

System.out.println(FastWindow + "空闲着等待服务客户");

try {

Thread.sleep(2000);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

 

}

};

}.start();

}

}

 

package com.baidu.interview;

//服务窗口类

public class BankWindow {

private String name;

private int NO;

//定义标记表明窗口是否在工作中。

public boolean isBusy=false;

public BankWindow(String name,int NO) {

this.name=name;

this.NO=NO;

}

@Override

public String toString() {

// TODO Auto-generated method stub

return NO+""+name;

}

//窗口工作方法,当isBusy=true。窗口开始工做。4秒后工作完成作

//isBusy=false;

public void work(){

if(this.isBusy){

new Thread(){

@Override

public void run() {

try {

Thread.sleep(4000);

catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

BankWindow.this.isBusy=false;

System.out.println(BankWindow.this+"服务完客户空闲中。");

};

}.start();

}

}

}

 

 

package com.baidu.interview;

 

public class Test {

 

public static void main(String[] args) {

// TODO Auto-generated method stub

CoursterQuence conquence=new CoursterQuence();

conquence.createCouster();

DispathSystem dis=new DispathSystem(conquence);

dis.genericGetCouster();

dis.getVipCouster();

dis.getFastCouster();

}

 

}

运行结果为(一部分运行结果)

新增1号快速业务客户

新增1号普通业务客户

新增1VIP客户

1号普通业务窗口取出1号普通客户为其服务

5VIP窗口取出1VIP客户为其服务

6号快速业务窗口取出1号快速业务客户为其服务

6号快速业务窗口空闲着等待服务客户

新增2号普通业务客户

4号普通业务窗口取出2号普通客户为其服务

新增3号普通业务客户

3号普通业务窗口取出3号普通客户为其服务

6号快速业务窗口空闲着等待服务客户

新增4号普通业务客户

5VIP窗口取出4号普通客户为其服务

新增2号快速业务客户

新增5号普通业务客户

1号普通业务窗口取出5号普通客户为其服务

1号普通业务窗口服务完客户空闲中。

6号快速业务窗口取出2号快速业务客户为其服务

6号快速业务窗口空闲着等待服务客户

新增6号普通业务客户

4号普通业务窗口服务完客户空闲中。

4号普通业务窗口取出6号普通客户为其服务

新增7号普通业务客户

VIP窗口服务好客户,空闲中等待服务客户

3号普通业务窗口服务完客户空闲中。

3号普通业务窗口取出7号普通客户为其服务

5VIP窗口空闲着等待服务客户

新增3号快速业务客户

新增2VIP客户

6号快速业务窗口取出3号快速业务客户为其服务

新增8号普通业务客户

5VIP窗口取出2VIP客户为其服务

6号快速业务窗口取出8号普通客户为其服务

新增9号普通业务客户

5VIP窗口取出9号普通客户为其服务

1号普通业务窗口服务完客户空闲中。

6号快速业务窗口窗口服务好客户,空闲中等待服务客户

6号快速业务窗口空闲着等待服务客户

新增10号普通业务客户

1号普通业务窗口取出10号普通客户为其服务

新增4号快速业务客户

4号普通业务窗口服务完客户空闲中。

新增11号普通业务客户

4号普通业务窗口取出11号普通客户为其服务

3号普通业务窗口服务完客户空闲中。

6号快速业务窗口取出4号快速业务客户为其服务

  -------<a href="http://www.itheima.com/"">android培训</a>、<a   href="http://www.itheima.com/" ">java培训</a>期待与您交流!----------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值