需求:
银行业务调度系统.
一、银行内有6各业务窗口,1-4窗口为普通窗口,5号窗口为快速窗口,6号窗口为VIP窗口。
二、有三种对应类型客户:VIP客户,普通客户,快速客户(办理如交水电费、电话费之类业务的客户)。
三、异步随机生成各种类型的客户,生成各种类型用户的概率比例为:
VIP客户:普通客户:快速客户=1:6:3.
四、客户办理业务所需时间有最大值和最小值,在该范围随机设定每个VIP客户以及普通客户办理业务所需的时间,快速客户办理业务所需时间为最小值(提示:办理业务的过程可通过线程Sleep的方式模拟)。
五、各类型客户在其对应窗口按顺序依次办理业务。
六、当VIP(6号)窗口和快速业务(五号)窗口没有客户等待办理业务的时候,这两个窗口可以处理普通客户的业务,而一旦有对应的客户等待办理业务的时候,则优先处理对应客户的业务。
七、随机生成客户时间间隔以及业务办理时间最大值和最小值自定,可以设置。
八、不需求实现GUI,只考虑系统逻辑实现,可通过Log方式展现程序运行结果
分析图:
银行客户系统功能类
import java.util.ArrayList;
import java.util.List;
class BankSystem {
private List<User> pt_user = new ArrayList<User>();
private List<User> q_user = new ArrayList<User>();
private List<User> vip_user = new ArrayList<User>();
private Object obj = new Object();
final int WINDOW_WT_TIME = 1000;
final int WINDOW_PT_TIME = 3000;
final int WINDOW_QS_TIME = 1000;
final int WINDOW_VIP_TIME = 6000;
public void UserNumber(int num) {
User user = new User();
user.setLv(num % 10);
user.setNumber(num + 1);
switch (user.getLv()) {
case "普通用户":
pt_user.add(user);
break;
case "快速用户":
q_user.add(user);
break;
case "VIP用户":
vip_user.add(user);
break;
}
System.out.println("第" + user.getNumber() + "用户光顾,您是----------------"
+ user.getLv());
}
public void BankWindowServise(int num) {
while (true) {
// 普通窗口服务。
if (num <4) {
if (pt_user.size() == 0) {
System.out.println("第" + num + "普通窗口没有接到普通客户,空闲!!!");
try {
Thread.sleep(WINDOW_WT_TIME);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} else {
User user = null;
synchronized (obj) {
user = pt_user.get(0);
pt_user.remove(0);
}
System.out.println("第" + user.getNumber() + "用户您好,您是"
+ user.getLv() + "___普通窗口为您服务");
try {
Thread.sleep(WINDOW_PT_TIME);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
// 快速窗口服务。
if (num == 4) {
if (q_user.size() == 0) {
System.out.println("第" + num + "快速窗口没有接到快速客户,转接普通用户。");
if (pt_user.size() == 0) {
System.out.println("第" + num + "快速窗口没有接到普通客户,空闲!!!");
try {
Thread.sleep(WINDOW_WT_TIME);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} else {
User user = null;
synchronized (obj) {
user = pt_user.get(0);
pt_user.remove(0);
}
System.out.println("第" + user.getNumber() + "用户您好,您是"
+ user.getLv() + "___快速窗口为您服务");
try {
Thread.sleep(WINDOW_PT_TIME);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
else {
User user = q_user.get(0);
System.out.println("第" + user.getNumber() + "用户您好,您是"
+ user.getLv() + "___快速窗口为您服务");
q_user.remove(0);
try {
Thread.sleep(WINDOW_QS_TIME);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
// VIP窗口服务。
if (num == 5) {
if (vip_user.size() == 0) {
System.out.println("第" + num + "VIP窗口没有接到VIP客户,转接普通用户。");
if (pt_user.size() == 0) {
System.out.println("第" + num + "VIP窗口没有接到普通客户,空闲!!!");
try {
Thread.sleep(WINDOW_WT_TIME);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} else {
User user = null;
synchronized (obj) {
user = pt_user.get(0);
pt_user.remove(0);
}
System.out.println("第" + user.getNumber() + "用户您好,您是"
+ user.getLv() + "___VIP窗口为您服务");
try {
Thread.sleep(WINDOW_PT_TIME);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
else {
User user = vip_user.get(0);
System.out.println("第" + user.getNumber() + "用户您好,您是"
+ user.getLv() + "___VIP窗口为您服务");
vip_user.remove(0);
try {
Thread.sleep(WINDOW_VIP_TIME);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}
用户排号。
public class CreatUserNumber implements Runnable {
private BankSystem bs;
CreatUserNumber(BankSystem bs) {
this.bs = bs;
}
public void run() {
for (int i = 0; i < 100; i++) {
bs.UserNumber(i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
用户类。
public class User {
String Lv;
int Number;
public String getLv() {
return Lv;
}
public void setLv(int lv) {
switch (lv) {
case 0:
Lv = "普通用户";
break;
case 1:
Lv = "普通用户";
break;
case 2:
Lv = "快速用户";
break;
case 3:
Lv = "普通用户";
break;
case 4:
Lv = "普通用户";
break;
case 5:
Lv = "快速用户";
break;
case 6:
Lv = "普通用户";
break;
case 7:
Lv = "普通用户";
break;
case 8:
Lv = "快速用户";
break;
case 9:
Lv = "VIP用户";
break;
}
}
public int getNumber() {
return Number;
}
public void setNumber(int number) {
Number = number;
}
}
创建普通窗口,快速窗口以及VIP窗口。
public class CreatPTWindow implements Runnable {
private BankSystem bs;
CreatPTWindow(BankSystem bs) {
this.bs = bs;
}
@Override
public void run() {
bs.BankWindowServise(1);
}
}
public class CreatQSWindow implements Runnable {
private BankSystem bs;
CreatQSWindow(BankSystem bs) {
this.bs = bs;
}
@Override
public void run() {
bs.BankWindowServise(4);
}
}
public class CreatVIPWindow implements Runnable {
private BankSystem bs;
CreatVIPWindow(BankSystem bs) {
this.bs = bs;
}
@Override
public void run() {
bs.BankWindowServise(5);
}
}
运行银行系统主函数。
public class BankClientRun {
public static void main(String[] args) throws Exception {
BankSystem bs = new BankSystem();
CreatUserNumber cun = new CreatUserNumber(bs);
CreatPTWindow cpw = new CreatPTWindow(bs);
CreatQSWindow cqw = new CreatQSWindow(bs);
CreatVIPWindow cvw = new CreatVIPWindow(bs);
new Thread(cun).start();
new Thread(cpw).start();//普通用户窗口为了便与观察结果只创建一个。
new Thread(cqw).start();
new Thread(cvw).start();
}
}
运行结果: