`
fcmfcm01
  • 浏览: 66723 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

银行排队的简单实现

阅读更多

这段时间在看Java并发编程方面的东西,注意到“生产者-消费者”模式,去某公司笔试的时候也遇到了这样的题,今天顺便把他用程序的方式写了下来。

 

UML就免了,不想画!顺便吐槽一下,小组开发,一定得用UML吗?随便画点图不行么?)

 

 

先上ServiceManager,它相当于大厅里的排号机,客户自己去排号,然后柜台的服务人员会去自动的取号:

 

/**
 * 
 */
package com.fcm.thread.banksample;

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.PriorityBlockingQueue;

/**
 * @author fenggcai
 * 
 */
public class ServiceManager {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		//only 50 customers could be served a time 
		final BlockingQueue<FIFOEntry<Customer>> customerQueue = new PriorityBlockingQueue<FIFOEntry<Customer>>(
				50);

		for (int i = 0; i < 52; i++) {
			int randomLevel = new Double(Math.random() * 5).intValue();
			Customer c = new Customer("Customer" + i,
					CustomerLevel.values()[randomLevel]);

			new Thread(new CustomerService(customerQueue, c)).start();

		}

		for (int i = 0; i < 5; i++) {
			BankService bs = new BankService(customerQueue);
			new Thread(bs).start();
			try {
				Thread.currentThread().sleep(1000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

		}

	}
}

 

接下来是客户自助排号CustomerService,这里做了一个简单的优先级CustomerLevel:

package com.fcm.thread.banksample;

import java.util.concurrent.BlockingQueue;

public class CustomerService implements Runnable {

	private final BlockingQueue<FIFOEntry<Customer>> customerQueue;
	private final Customer rootCustomer;

	public CustomerService(BlockingQueue<FIFOEntry<Customer>> customerQueue,
			Customer rootCustomer) {
		super();
		this.customerQueue = customerQueue;
		this.rootCustomer = rootCustomer;
	}

	@Override
	public void run() {	
			try {
				addCustomer(rootCustomer);
			} catch (InterruptedException e) {
				Thread.currentThread().interrupt();
			}
		
	}

	private void addCustomer(Customer customer) throws InterruptedException {
		if (!customerQueue.contains(customer)) {
			try {
				customerQueue.add(new FIFOEntry<Customer>(customer));
			} catch (IllegalStateException e) {
				System.out.println("The queue is full!!");
				throw new InterruptedException("Reach capacity limit.");
			}
		}
	}
}


package com.fcm.thread.banksample;

public enum CustomerLevel {
	BELOW_NORMAL,NORMAL,VIP,GOLD_VIP,URGUNT;
}



 

对于customer本身,因为前文提到了优先级的问题,所以为了排序的需要,这里我加入了对Comparable接口的支持:

package com.fcm.thread.banksample;

public class Customer implements Comparable<Customer> {

	private String customerName;
	private CustomerLevel level;

	/**
	 * @return the customerName
	 */
	public String getCustomerName() {
		return customerName;
	}

	public Customer(String customerName, CustomerLevel level) {
		super();
		this.customerName = customerName;
		this.level = level;
	
	}

	/**
	 * @param customerName
	 *            the customerName to set
	 */
	public void setCustomerName(String customerName) {
		this.customerName = customerName;
	}

	/**
	 * @return the level
	 */
	public CustomerLevel getLevel() {
		return level;
	}

	/**
	 * @param level
	 *            the level to set
	 */
	public void setLevel(CustomerLevel level) {
		this.level = level;
	}

	@Override
	public int compareTo(Customer o) {
		return o.getLevel().ordinal()-this.level.ordinal();
	}
	
	public String toString(){
		return (this.getCustomerName()+":"+this.getLevel().toString());
	}
}

 

我们可以想象,在同一时间到银行办业务的人,优先级(业务类型)一样的肯定很多,则必须得有个先来后到不是,所以我引入了FIFOEntry,来保证相应的顺序:

package com.fcm.thread.banksample;

import java.util.concurrent.atomic.AtomicInteger;

public class FIFOEntry<E extends Comparable<? super E>> implements
		Comparable<FIFOEntry<E>> {

	final static AtomicInteger seq = new AtomicInteger();
	final long seqNum;
	final E entry;

	public FIFOEntry(E entry) {
		seqNum = seq.getAndIncrement();
		this.entry = entry;
	}

	public E getEntry() {
		return entry;
	}

	@Override
	public int compareTo(FIFOEntry<E> other) {
		int result = entry.compareTo(other.entry);
		if (result == 0 && other.entry != this.entry) {
			result = (seqNum < other.seqNum ? -1 : 1);
		}
		return result;
	}

}

 好,到现在可以由银行的职员根据相应的优先级取回对应的工作了:

package com.fcm.thread.banksample;

import java.util.concurrent.BlockingQueue;

public class BankService implements Runnable {
	//working queue,it would be given by service manager
	private final BlockingQueue<FIFOEntry<Customer>> customerQueue;
	
	
	public BankService(BlockingQueue<FIFOEntry<Customer>> customerQueue) {
		super();
		this.customerQueue = customerQueue;
	}
	@Override
	public void run() {
		try {
			while(!customerQueue.isEmpty()){
				service(customerQueue.take().getEntry());
			}
		} catch (Exception e) {
			Thread.currentThread().interrupt();
		}
		
	}

	public void service(Customer c){
		System.out.println(c.getCustomerName()+":"+c.getLevel().toString());
	}
}

 

 

分享到:
评论

相关推荐

    银行排队叫号系统实现

    银行排队叫号系统是一种用于管理客户在银行等待服务的智能化工具,它有效地改善了传统的人工排队模式,提高了服务效率,降低了客户的等待焦虑。在这个项目中,我们将探讨该系统的核心功能、实现技术以及涉及到的关键...

    C语言编写的银行排队系统

    【标题】"C语言编写的银行排队系统"揭示了这个项目是使用C语言来实现的一个模拟银行服务流程的软件。C语言是一种基础且强大的编程语言,适用于开发操作系统、嵌入式系统以及各种应用软件,包括模拟现实生活中的场景...

    银行排队叫号系统

    银行排队叫号系统是一种用于管理客户在银行等待服务的智能化工具,它通常由软件和硬件两部分组成。在这个C++软件实习项目中,我们利用Microsoft Foundation Classes (MFC)库来构建这样一个系统,以实现高效、有序的...

    数据结构 银行排队系统

    本项目“银行排队系统”是基于Visual C++实现的一个具体实例,它巧妙地运用了数据结构来模拟现实生活中银行的排队过程。这个系统不仅包含了源代码,还有系统的导航文档和详细的实验报告,为我们提供了深入理解数据...

    银行排队模拟系统(无qt)

    总的来说,这个银行排队模拟系统是一个基于嵌入式开发的实践项目,通过用户程序、按键驱动和等待队列模拟驱动三部分,实现了对银行排队过程的模拟。这种模拟有助于理解并发处理、队列数据结构和用户交互等计算机科学...

    数据结构队列的简单应用--银行排队系统

    在本文中,我们将深入探讨队列如何应用于银行排队系统,模拟真实世界中的服务流程,以此来提高效率和优化用户体验。 首先,让我们理解什么是队列。队列是一种线性数据结构,遵循“先进先出”(First In First Out, ...

    C语言银行系统的实现

    在本项目中,我们探讨了如何使用C语言来实现一个简单的银行系统。C语言是一种强大的、底层的编程语言,常用于开发系统软件、嵌入式系统以及各种应用程序,包括模拟银行系统。这样的系统通常需要处理账户管理、交易...

    基于红帽Linux的银行排队叫号系统.pdf

    基于红帽Linux的银行排队叫号系统.pdf

    银行排队系统(队列)

    在IT行业中,银行排队系统是一种常见的应用场景,它利用计算机编程技术来模拟现实生活中的排队场景,以提高服务效率和客户满意度。在这个系统中,"队列"数据结构扮演着至关重要的角色。队列是一种先进先出(FIFO, ...

    银行排队系统数据分析及窗口设置优化研

    ### 银行排队系统数据分析及窗口设置优化研究 #### 摘要 本文通过实证研究探讨了银行排队系统的数据分析及其窗口设置优化方案。基于广州市某商业银行2007年1月至4月间的窗口自动叫号机数据,研究者采用排队论理论,...

    银行排队系统 用c编写

    在给定的C语言代码中,我们看到一个简单的银行排队系统被实现,它允许用户取号(入队)或叫号(出队),并且通过循环来持续运行。 首先,定义了一个名为`wait`的结构体,用于存储队列的状态。这个结构体包含三个...

    运筹学课程设计(银行排队叫号模型)

    - **模型介绍**:对银行排队模型的简单描述,包括模型假设和目标。 - **理论分析**:排队论的基本原理和公式,如何应用到银行场景。 - **算法设计**:Java模拟的具体步骤,包括数据结构的选择和处理逻辑。 - **结果...

    XianxingBiao.rar_银行 排队

    《银行排队系统实现——基于单链表与双链表的数据结构》 在信息化社会中,银行排队管理系统是提高服务效率、优化客户体验的重要工具。本文将深入探讨如何使用数据结构中的单链表和双链表来实现这样一个系统,旨在...

    银行排队系统模拟C++

    在本项目中,"银行排队系统模拟C++"是一个基于C++编程语言实现的应用程序,其核心目标是通过计算机模拟真实世界中的银行排队场景。银行排队系统涉及到多个关键概念,如客户服务时间的随机性、顾客到达的随机性以及...

    银行客户排队系统模拟

    客户到银行办理业务,需要取号排队等候。客户分为VIP客户、理财客户、一般客户三种类型。不同类型客户,取得不同的排队序号凭证,进入不同序列排队等候。当服务窗口出现空闲时,按既定策略从三种类型客户中选取客户...

    银行排队系统

    本文将深入探讨银行排队系统的实现原理,以及如何使用C语言进行开发。 一、系统设计与功能模块 1. 取号模块:用户进入银行后,可以通过自助服务终端或手机APP获取号码票。系统根据不同的业务类型(如存款、取款、...

    201120181518银行排队系统.zip

    现代银行排队系统往往引入人工智能和大数据技术,实现动态调度和服务预测: 1. 预测分析:利用历史数据预测高峰期和低谷期,提前调整窗口资源。 2. 智能调度:根据实时人流情况,动态调整窗口开放数量和服务顺序。 3...

    基于单片机的银行排队系统的设计

    【基于单片机的银行排队系统的设计】 随着社会经济的发展,银行等服务机构对提升服务质量的需求日益增长,以满足客户个性化的需求。传统的排队方式已无法满足高效、有序的服务体验,因此,基于单片机的智能排队系统...

Global site tag (gtag.js) - Google Analytics