您的位置:首页 > 职场人生

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

2012-10-08 20:58 441 查看
------- android培训java培训、期待与您交流! ----------

看了张老师的视频后,按照自己的设计思路试着编了下,张老师把取号机设计成了两个类,我觉得这样不合适,取号机就是一个对象,这个对象也并不复杂,所以我觉得用一个类来封装它就足够了,类设计多了反而人觉得程序有些混乱,个人观点,不足之处,望指教

package cn.itcast.bank;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

public class MainClass {
public static void main(String[] args) {
int windowNumber;// 窗口编号
/* 创建4个普通窗口 */
for (windowNumber = 1; windowNumber <= 4; windowNumber++) {
new ServiceWindow(CustomerType.GENERAL, windowNumber);
}
new ServiceWindow(CustomerType.FAST, windowNumber++);// 创建1个快速窗口
new ServiceWindow(CustomerType.VIP, windowNumber++);// 创建1个VIP窗口
NumberMachine.getInstance().open();// 打开号码管理器的开关
}
}

/* 服务窗口类 */
class ServiceWindow {
private static NumberMachine numberMachine = NumberMachine.getInstance();// 所有服务窗口共享一个号码管理器
private CustomerType type;// 窗口类型
private int number;// 窗口编号

/**
* @param type
* 窗口类型
* @param number
* 窗口编号
*/
public ServiceWindow(CustomerType type, int number) {
this.number = number;
this.type = type;
Executors.newScheduledThreadPool(1).schedule(new Runnable() {
@Override
public void run() {
Random random = new Random();
do {
/* 向号码管理器索取下一个顾客,如果没有索取到则返回null */
Customer customer = numberMachine.getCustomer(ServiceWindow.this);
if (null == customer) {
System.out.println(ServiceWindow.this.getNumber()
+ "号窗口空闭中");
try {
Thread.sleep(2000);// 窗口休息2秒再进行下一次索取
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
System.out.println(customer.toString() + "到"
+ ServiceWindow.this.getNumber() + "号窗口办理业务");
try {
Thread.sleep((random.nextInt(19000) + 1000));// 如果索取到了顾客,随机生成为该顾客服务的时间
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(ServiceWindow.this.getNumber()
+ "号窗口为" + customer.toString() + "办理完毕");
}
} while (true);
}

}, 0, TimeUnit.SECONDS);
}

public int getNumber() {
return number;// 返回窗口的的编号
}

public CustomerType getType() {
return type;// 返回窗口的类型
}
}

/* 号码管理器类 */
class NumberMachine {
private int customers = 0;// 客户编号,每来一个顾客,这个编号的值就会增加1
private List<customer> generalList = new ArrayList<customer>();// 普通用户队列
private List<customer> fastList = new ArrayList<customer>();// 快速用户队列
private List<customer> VIPList = new ArrayList<customer>();// VIP用户队列
private static NumberMachine numberMachine = new NumberMachine();// 单例
private boolean onOff = false;// 号码管理器的开关初始状态为关

private NumberMachine() {
}

public static NumberMachine getInstance() {
return numberMachine;
}

public void open() {// 打开开关,让号码管理器开始工作
onOff = true;
Executors.newScheduledThreadPool(1).schedule(new Runnable() {
@Override
public void run() {
Random random = new Random();
while (onOff) {
try {
Thread.sleep((random.nextInt(3) + 1) * 1000);// 随机生成顾客到来的时间间隔
} catch (InterruptedException e) {
e.printStackTrace();
}
switch (random.nextInt(10)) {// VIP客户:快速客户:普通客户=1:3:6
case 0:
/* VIP客户加入到VIP用户队列 */
VIPList.add(new Customer(CustomerType.VIP, ++customers));
System.out.println(VIPList.get(VIPList.size() - 1)
.toString() + "进入VIP用户队列");
break;
case 1:
case 2:
case 3:
/* 快速用户加入到快速用户队列 */
fastList.add(new Customer(CustomerType.FAST,
++customers));
System.out.println(fastList.get(fastList.size() - 1)
.toString() + "进入快速用户队列");
break;
default:
/* 普通用户加入到普通用户队列 */
generalList.add(new Customer(CustomerType.GENERAL,
++customers));
System.out.println(generalList.get(
generalList.size() - 1).toString()
+ "进入普通用户队列");
}
}
}
}, 0, TimeUnit.SECONDS);

}

/* 多个线程都在向号码管理器索取客户,所以要同步,如果不同步可能会出现两个窗口取到同一个客户 */
public synchronized Customer getCustomer(ServiceWindow serviceWindow) {
Customer customer = null;// 取到的客户,初始值为null
switch (serviceWindow.getType()) {
case GENERAL:// 普通窗口在索取
if (0 < generalList.size()) {
customer = generalList.remove(0);
} else if (0 < VIPList.size()) {
customer = VIPList.remove(0);
} else if (0 < fastList.size()) {
customer = fastList.remove(0);
}
break;
case FAST:// 快速窗口在索取
if (0 < fastList.size()) {
customer = fastList.remove(0);
} else if (0 < VIPList.size()) {
customer = VIPList.remove(0);
} else if (0 < generalList.size()) {
customer = generalList.remove(0);
}
break;
case VIP:// VIP窗口在索取
if (0 < VIPList.size()) {
customer = VIPList.remove(0);
} else if (0 < generalList.size()) {
customer = generalList.remove(0);
} else if (0 < fastList.size()) {
customer = fastList.remove(0);
}
}
return customer;// 返回取到的客户
}

public void close() {// 关闭号码管理器
onOff = false;
}
}

class Customer {
private CustomerType type;// 客户类型
private int number;// 客户编号

public Customer(CustomerType type, int number) {
this.type = type;
this.number = number;
}

public String toString() {
switch (type) {
case GENERAL:
return "第" + number + "号普通用户";
case FAST:
return "第" + number + "号快速用户";
case VIP:
return "第" + number + "号VIP用户";
}
return null;
}

public CustomerType getType() {
return type;
}

public void setType(CustomerType type) {
this.type = type;
}

public int getNumber() {
return number;
}

public void setNumber(int number) {
this.number = number;
}
}

/* 3种不同的服务类型 */
enum CustomerType {
GENERAL, FAST, VIP
};

</customer></customer></customer></customer></customer></customer>

------- android培训java培训、期待与您交流! ----------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: