黑马程序员-银行挂号系统(张孝祥老师)

来源:互联网 发布:零基础学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);
}
}

0 0
原创粉丝点击