一、问题描述
去银行办理业务时,银行有固定的柜台数量,然后不定时有客户来银行办理业务。来的时候,客户先取号,再等着排队叫号。为了保证公平,叫号时要按照排队顺序叫,不能插队。
二、问题分析
这其实是一个典型的生产者消费者模式,其中柜台是消费者,而顾客是生产者。为了保存客户的排队状态,需要使用一个先进先出的队列来作为缓冲区。客户(生产者)来了以后,就进缓冲区排队。而每个柜台每办理完一个客户的业务,就从缓冲区中取出一个客户继续办理业务。
三、实现
分析清楚以后,来进行实现。
3.1 缓冲区的实现
我们实现首先实现缓冲区,代码如下:
import java.util.LinkedList;
import java.util.Queue;
public class CallHall {
private static CallHall callHall;
private final int MAX_NUM=999;//叫到的最大号
/**
* 单例获取方式
* @return
*/
public static CallHall getInstance(){
if (callHall ==null){
callHall =new CallHall();
}
return callHall;
}
private CallHall() {
}
private int lastNumber = 1;//当前最后一个客户的号码
private Queue<Integer> queue = new LinkedList<>();//叫号队列
/**
* 新加入一个客户
* @return
*/
public synchronized Integer generateNewManager() {
if (lastNumber>MAX_NUM)//当叫号达到最大号码,从1重新开始排号
lastNumber=1;
queue.offer(lastNumber);
return lastNumber++;
}
/**
* 从缓冲区中取一个客户出来
* @return
*/
public synchronized Integer fetchServiceNumber() {
Integer number