黑马程序员-银行挂号系统(张孝祥老师)
来源:互联网 发布:零基础学c语言 pdf 编辑:程序博客网 时间:2024/04/30 00:06
- ------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------
- 设置一个类,表示控制取出和生成票
package cn.itheima.bank;
import java.util.ArrayList;
import java.util.List;
//所有的挂号票
public class Numbers {
private int QueueNum = 0;//设置有一个计数器,记录队列票数
private List<Integer> QueueNumsList = new ArrayList<Integer>();//设置一个集合,方便拿取票
//拿走一张票,表示正在排队
public synchronized Integer generateNum(){
QueueNumsList.add(++QueueNum);
return QueueNum;
}
//取走一个票,表示正在服务客户
public synchronized Integer serviceNum(){
if(QueueNumsList.size() > 0){
return QueueNumsList.remove(0);
}else{
return null;
}
}
}
- 自动票挂号机,管理所有的票
package cn.itheima.bank;
public class NumberMachine {
private NumberMachine(){};
private static NumberMachine numberMachine = new NumberMachine();
public static NumberMachine getInstance(){
return numberMachine;
}
//保证各个类型窗口操作的都是对应类型的客户
private Numbers ordinaryNum = new Numbers();
private Numbers fastNum = new Numbers();
private Numbers vipNum = new Numbers();
public Numbers getOrdinary(){
return ordinaryNum;
}
public Numbers getFastNum(){
return fastNum;
}
public Numbers getVipNum(){
return vipNum;
}
}
- 枚举,设置三种窗口类型,并且覆盖toString方法
package cn.itheima.bank;
public enum CustomerType {
ORDINARY, FAST, VIP;
@Override
public String toString(){
String name = null;
switch(this){
case ORDINARY:
name = "普通";
break;
case FAST:
name = "快速";
break;
case VIP:
name = name();
break;
}
return name;
}
}
- 设置各个售票窗口
package cn.itheima.bank;
import java.util.Random;
import java.util.concurrent.Executors;
public class ServiceWindows {
private CustomerType customer = CustomerType.ORDINARY;//设置一个枚举,设置只能有三种票的类型
private int num = 1;//设置一个窗口记录器
public CustomerType getCustomer() {
return customer;
}
public void setCustomer(CustomerType customer) {
this.customer = customer;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public void start(){
Executors.newSingleThreadExecutor().execute(new Runnable() {
@Override
public void run() {
while(true){
switch(customer){
case ORDINARY://如果是普通窗口,那么寻找对应的窗口开启
ordinaryService();
break;
case FAST:
fastService();
break;
case VIP:
VIPService();
break;
}
}
}
});
}
private void ordinaryService(){
System.out.println(num+"号普通窗口正在获取任务...");
//从自动挂号机那里拿到普通票
Integer serviceNum = NumberMachine.getInstance().getOrdinary().serviceNum();
if(serviceNum != null){
//如果有票,那么显示正在服务的人
System.out.println(num+"号"+customer+"窗口正在为"+serviceNum+"号"+customer+"客户服务...");
long time = new Random().nextInt(9000)+1000;
try {
Thread.sleep(time);//设定为客户服务的时间,1到10秒
} catch (InterruptedException e) {
e.printStackTrace();
}
//显示为客户服务的时间
System.out.println(num+"号普通窗口为"+serviceNum+"号普通客户服务完成,耗时"+(int)time/1000+"秒");
}else{
//如果没有拿到票,那么空闲一秒
System.out.println(num+"号"+customer+"窗口,没有获取到普通客户,空闲1秒中...");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
private void fastService(){
System.out.println(num+"号快速窗口正在获取任务...");
//从自动挂号机那里拿到快速票
Integer serviceNum = NumberMachine.getInstance().getFastNum().serviceNum();
if(serviceNum != null){
System.out.println(num+"号"+customer+"窗口正在为"+serviceNum+"号"+customer+"客户服务...");
long time = new Random().nextInt(9000)+1000;
try {
Thread.sleep(time);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(num+"号"+customer+"窗口为"+serviceNum+"号"+customer+"客户服务完成,耗时"+(int)time/1000+"秒");
}else{
//如果没有快速客户,那么去接单普通客户
System.out.println(num+"号快速窗口,没有获取到快速客户,正在获取普通客户...");
ordinaryService();
}
}
private void VIPService(){
System.out.println(num+"号VIP窗口正在获取任务...");
//从自动挂号机那里拿到VIP票
Integer serviceNum = NumberMachine.getInstance().getVipNum().serviceNum();
if(serviceNum != null){
System.out.println(num+"号"+customer+"窗口正在为"+serviceNum+"号"+customer+"客户服务...");
long time = new Random().nextInt(9000)+1000;
try {
Thread.sleep(time);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(num+"号"+customer+"窗口为"+serviceNum+"号"+customer+"客户服务完成,耗时"+(int)time/1000+"秒");
}else{
//如果没有VIP客户,那么去接单普通客户
System.out.println(num+"号VIP窗口,没有获取到VIP客户,正在获取普通客户...");
ordinaryService();
}
}
}
- 模拟客户排队取票,并运行程序
package cn.itheima.bank;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
public class MianText {
public static void main(String[] args) {
//设置4个普通窗口,并且编号
for(int i=1; i<5; i++){
ServiceWindows windows1 = new ServiceWindows();
windows1.setNum(i);
windows1.start();
}
//设置一个快速窗口
ServiceWindows windows2 = new ServiceWindows();
windows2.setCustomer(CustomerType.FAST);
windows2.start();
//设置一个VIP窗口
ServiceWindows windows3 = new ServiceWindows();
windows3.setCustomer(CustomerType.VIP);
windows3.start();
//使用Executors模拟普通客户源源不断的取票
Executors.newScheduledThreadPool(1).scheduleWithFixedDelay(
new Runnable() {
@Override
public void run() {
//从NumberMachine那里取到普通票
Integer num = NumberMachine.getInstance().getOrdinary().generateNum();
System.out.println("第"+num+"号普通客户正在等待服务!!!");
}
},
0,
1,
TimeUnit.SECONDS);
Executors.newScheduledThreadPool(1).scheduleWithFixedDelay(
new Runnable() {
@Override
public void run() {
//从NumberMachine那里取到快速票
Integer num = NumberMachine.getInstance().getFastNum().generateNum();
System.out.println("第"+num+"号快速客户正在等待服务!!!");
}
},
0,
2,
TimeUnit.SECONDS);
Executors.newScheduledThreadPool(1).scheduleWithFixedDelay(
new Runnable() {
@Override
public void run() {
//从NumberMachine那里取到VIP票
Integer num = NumberMachine.getInstance().getVipNum().generateNum();
System.out.println("第"+num+"号VIP客户正在等待服务!!!");
}
},
0,
6,
TimeUnit.SECONDS);
}
}
- 黑马程序员-银行挂号系统(张孝祥老师)
- 黑马程序员 张老师 面试题讲解 银行调度系统
- [黑马程序员]银行系统-跟着张老师敲代码
- 黑马程序员---银行系统
- 黑马程序员:银行系统
- 黑马程序员 银行系统
- 【黑马程序员】银行系统
- 黑马程序员------银行系统
- 黑马程序员_张孝祥老师的银行调度面试题
- 黑马程序员_张孝祥银行调度系统
- 黑马程序员---银行系统(十九)
- 黑马程序员-银行调度系统(2)
- 黑马程序员-交通灯管理系统(张孝祥老师)
- 黑马程序员------张孝祥老师------交通灯管理系统
- 黑马程序员------张孝祥老师------银行业务调度系统
- 张孝祥老师银行系统案例
- 黑马程序员--张老师的银行系统没我的好,我给改了~
- 黑马程序员 银行调度系统
- 设计模式:迪米特法则
- 玩转色彩魅力 现代风格美屋设计
- 运行地址与执行地址
- vim快捷键整理
- Android使用FFmpeg实现定时录像
- 黑马程序员-银行挂号系统(张孝祥老师)
- PHP的语言特性-面向对象和C++/java/python的相似之处
- EAS F7多选
- 记录工作中遇到的难点
- 【转载】J2SE知识点归纳笔记(七)---Java IO Part 2:获取键盘输入与IO流体系图
- 程序员语摘
- 设计模式:开闭原则
- xCode编译有错误 却没有提示错误出处
- 导航栏图标背景颜色随点击发生变化