告诉你什么是优雅的代码(7)-----银行作业调度系统


公告:C1000,请到1号窗口办理,估计用时48秒。
公告:普通客户C1000进入银行。
公告:V1000,请到VIP窗口办理,估计用时31秒。
公告:vip客户V1000进入银行。
公告:C1001,请到2号窗口办理,估计用时18秒。
公告:普通客户C1001进入银行。
公告:快速客户R1000进入银行。
公告:C1002,请到3号窗口办理,估计用时18秒。
公告:普通客户C1002进入银行。
公告:C1003,请到4号窗口办理,估计用时39秒。
公告:普通客户C1003进入银行。
公告:快速客户R1001进入银行。
公告:C1004,请到快速窗口办理,估计用时15秒。
公告:普通客户C1004进入银行。
公告:快速客户R1002进入银行。
2号窗口:C1001业务办理完毕。
公告:快速客户R1003进入银行。
公告:普通客户C1005进入银行。
公告:C1005,请到2号窗口办理,估计用时36秒。
3号窗口:C1002业务办理完毕。
公告:普通客户C1006进入银行。
公告:C1006,请到3号窗口办理,估计用时47秒。
VIP窗口:V1000业务办理完毕。
公告:普通客户C1007进入银行。
快速窗口:C1004业务办理完毕。
公告:R1000,请到快速窗口办理,估计用时15秒。
公告:普通客户C1008进入银行。
公告:C1007,请到VIP窗口办理,估计用时17秒。
公告:普通客户C1009进入银行。
公告:vip客户V1001进入银行。
公告:快速客户R1004进入银行。
1号窗口:C1000业务办理完毕。
公告:C1008,请到1号窗口办理,估计用时44秒。
公告:普通客户C1010进入银行。
快速窗口:R1000业务办理完毕。
公告:R1001,请到快速窗口办理,估计用时15秒。



不要以为进了银行,上面是本期优雅代码所实现的功能。其中:
C = common customer R = rapid customer V = vip customer.
一般情况下,不同类型的窗口接应不同类型的客户。Vip与快速窗口空闲时可接受普通客户。
实现这个系统很难吗?Not at all,after reading this article ,you can!

好了,闲话休提,看下这个系统的用法:


public static void main(String[] args) {
Bank bank = Bank.getInstance();
bank.open();
}

public void open(){
for(int i = 1; i < 5 ; i++){
new CommonCounter(i + "号窗口").start();
}
new RapidCounter("快速窗口").start();

new VipCounter("VIP窗口").start();
......
}




由代码可知,银行开门时开了4个普通窗口,一个快速窗口,一个VIP窗口。这些窗口都是独立的线程。考虑到窗口的共性,可抽象出一个基类:


public abstract class Counter extends Thread{

protected String name;
protected Bank bank = Bank.getInstance();
protected boolean working = false;


public Counter(String name){
this.name = name;
}
public void run(){
working = true;
while(working){
String cust = callCust();
long needTime = genProcessTime();
System.out.println(new StringBuffer().append("公告:").append(cust).append(",")
.append("请到").append(name).append("办理,估计用时").
append(needTime).append("秒。"));

try {
Thread.sleep(needTime * 1000);
} catch (InterruptedException e) {

e.printStackTrace();
}
System.out.println(new StringBuffer().append(name)
.append(":").append(cust).append("业务办理完毕。"));
}
}
protected abstract String callCust();
protected abstract long genProcessTime();

}




看清楚了吗,这个基类完成了呼叫的主要逻辑,其中有两个抽象方法,留给不同的特殊窗口去实现。一个是呼叫客户的规则callCust,一个是窗口处理时间的评估函数。特殊窗口的代码?留给聪明的你了。

OK,下面请出这个系统的主角:

[size=large][color=red]BlockingQueue[/color][/size]

是不是有点陌生,是就去翻下api了。这个东西有两个特长,线程安全与阻塞,有了这个实力派主角,什么生产者消费者模型都可以轻松实现。

上面这句话已经点题了,啊?生产什么?消费什么?

生产客户,消费客户!

我们为三种客户排个队吧:

BlockingQueue<String> commonCusts = new ArrayBlockingQueue<String>(10);
BlockingQueue<String> rapidCusts = new ArrayBlockingQueue<String>(10);
BlockingQueue<String> vipCusts = new ArrayBlockingQueue<String>(10);



现在已经很明朗了,如何生产客户,请听下回分解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值