队列的应用

问题描述:

实现银行排队叫号服务问题。

排队叫号软件的具体操作流程:

(1)顾客取服务序号

(2)服务员工呼叫顾客

1.设计思路:

在银行排队叫号软件中,设计两个类,一个是排队机类QueueMachine,该类根据银行工作的开始时间和结束时间创建一个队列,当顾客按Enter键时,为顾客获得一个服务号,并将顾客服务加入队列;另一个是服务窗口类ServiceWindow,服务窗口的职能是为排队的服务,每当服务窗口按照先进先出的原则从队列中选取一个人进行服务时,就有一个顾客出队。使用多线程技术模拟服务窗口,为了确保排队机服务与服务窗口的并行工作,排队机的服务业用多线程技术实现。

2.代码实现:

import java.util.*;
import java.text.*;
//排队机类
class QueueMachine implements Runnable
{
private int number;
private Queue<Integer>queue;//使用多态,父类引用可以指向子类对象
private String starttime;
private String endtime;
public QueueMachine(String starttime,String endtime)
{
queue=new LinkedList<Integer>();
this.starttime=starttime;
this.endtime=endtime;
}
public Queue<Integer>getQueue()
{
return queue;
}
public void run()
{
Scanner sc=new Scanner(System.in);
SimpleDateFormat df=new SimpleDateFormat("HHmm");//设置时间格式,小时小时分钟分钟
String time=df.format(new Date());
while(time.compareTo(starttime)>=0&&time.compareTo(endtime)<=0)
{
System.out.println("按回车键获取号码:");
sc.nextLine();               //换行
int callnumber=++number;
if(queue.offer(callnumber))//offer()将元素插入到队列末尾
{
System.out.println(String.format("您的号码是:%d,你前面有%d位,请等待",
callnumber,queue.size()-1));
time=df.format(new Date());
}
else{
    System.out.println("Busy now!please wait for a minute!");
number--;
}
}
sc.close();
System.out.println("已到下班时间,请明天再来");
}
}
//服务类
class ServiceWindow implements Runnable
{
private Queue<Integer>queue;//服务队列
public ServiceWindow(Queue<Integer>queue)
{
this.queue=queue;
}
public void run()
{
while (true)
{
synchronized(queue)       //实现同步,使某个服务操作队列时,其他服务处于阻塞状态
   {
if(queue.size()>0)
{
System.out.println(String.format("请%d号到%s号窗口!",queue.poll(),Thread.currentThread().getName()));
}
}
try
{
Thread.sleep(10000);//窗口叫号及银行柜台人员工作时间10s
}
catch (InterruptedException e)
{
System.out.println(e.getMessage());
}
}
}
}




//测试用例
class  TestBankQueue
{
public static void main(String[] args) 
{
int windowcount=2;           //设置银行柜台的服务窗口数,先设为1,然后可以依次增加
ServiceWindow[]sw=new ServiceWindow[windowcount]; //创建服务窗口数组
Thread []t=new Thread[windowcount];
QueueMachine qm=new QueueMachine("0800","1630"); //创建排队机对象
new Thread(qm).start();          //起动排队机服务
for(int i=0;i<windowcount;i++)
{
sw[i]=new ServiceWindow(qm.getQueue());
t[i]=new Thread(sw[i]);
t[i].setName(""+(i+1));
t[i].start();

}
}
}

总结

注意多线程编程时的同步问题,若有多个线程要操作统一数据内容,则要加锁。本例中叫号队列为多个服务线程所共享,所以加了锁。


  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值