`
zzhonghe
  • 浏览: 248164 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

并发编程 出纳-顾客模型 仿真练习

    博客分类:
  • Java
阅读更多
这个仿真模型包括如下几个对象:

顾客: 随机的时间间隔出现顾客,每个顾客办理业务的时间也是随机。顾客会排队办理业务。

出纳: 每次选取排在最前面的顾客进行服务,服务时间由顾客的业务时间而定。

出纳经理: 每隔一段时间,查看顾客排队的人数,排队的人多就增加出纳窗口,排队人少的话,就减少出纳窗口,让出纳休息。


通过调整这个模型的参数: 

1.顾客出现的时间间隔
2.各项业务办理的时间

可以估算出柜台大致需要多少个出纳。


package test.thread;

import static java.lang.System.out;

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.PriorityBlockingQueue;
import java.util.concurrent.TimeUnit;

public class SimulatorTeller {

	public static void main(String args[]){
		BlockingQueue<Customer> customerQueue=new LinkedBlockingQueue();;
		PriorityBlockingQueue<Teller> tellerRestQueue=new PriorityBlockingQueue();
		PriorityBlockingQueue<Teller> tellerWorkQueue=new PriorityBlockingQueue();
		ExecutorService se=Executors.newCachedThreadPool();
		se.execute(new CustomerGenerator(customerQueue));
		se.execute(new TellerManager(customerQueue,tellerRestQueue,tellerWorkQueue,se));
	}
}

class Customer{
	static int count=0;
	final int id=count++;
	final int serviceTime=(int)(5000* Math.random());
}

class CustomerGenerator implements Runnable{
	private BlockingQueue<Customer> customerQueue;
	public CustomerGenerator(BlockingQueue<Customer> customerQueue) {
		this.customerQueue = customerQueue;
	}
	public void run() {
		try {
			while(!Thread.interrupted()){
				customerQueue.offer(new Customer());
				TimeUnit.MILLISECONDS.sleep((long)(Math.random()*1000));
			}
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

class Teller implements Runnable, Comparable<Teller>{
	static int count=0;
	final int id=count++;
	private BlockingQueue<Customer> customerQueue;
	private boolean canRest=false;
	private int servedCount=0;
	public Teller(BlockingQueue<Customer> customerQueue) {
		this.customerQueue = customerQueue;
	}
	
	public void takeABreak(){
		out.println("Teller#"+id+" have served "+servedCount+" customer, take a break now.");
		this.canRest=true;
		servedCount=0;
	}
	
	public synchronized void goBackToWork(){
		out.println("Too many customer waiting, Teller#"+id+" go back to work.");
		this.canRest=false;
		this.notify();
	}
	
	public void run() {
		try {
			while (!Thread.interrupted()) {
				Customer c=customerQueue.take();
				TimeUnit.MILLISECONDS.sleep(c.serviceTime);
				synchronized(this){
					servedCount++;
					out.println("Teller#"+id+" serverd customer#"+c.id);
					if(canRest){
						wait();
					}
				}
			}
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	//serverCount多的Teller优先获得休息权力
	public int compareTo(Teller o) {
		return this.servedCount < o.servedCount ? 1
				: this.servedCount > o.servedCount ? -1 : 0;
	}

}


class TellerManager implements Runnable{
	
	private BlockingQueue<Customer> customerQueue;
	private PriorityBlockingQueue<Teller> tellerRestQueue;
	private PriorityBlockingQueue<Teller> tellerWorkQueue;
	private ExecutorService se;
	
	public TellerManager(BlockingQueue<Customer> customerQueue,
			PriorityBlockingQueue<Teller> tellerRestQueue,
			PriorityBlockingQueue<Teller> tellerWorkQueue, ExecutorService se) {
		this.customerQueue = customerQueue;
		this.tellerRestQueue = tellerRestQueue;
		this.tellerWorkQueue = tellerWorkQueue;
		this.se = se;
	}

	public void run() {
		try {
			while (!Thread.interrupted()) {
				makeAjustMent();
				TimeUnit.MILLISECONDS.sleep(2000l);
			}
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	private void makeAjustMent() {
		try {
			out.println("Customer["+customerQueue.size()+"]/TellerWorker["+tellerWorkQueue.size()+"]/TellerRest["+tellerRestQueue.size()+"]");
			if (tellerWorkQueue.size() == 0&&tellerRestQueue.size() == 0) {
				assignNewTeller();
			} else if (customerQueue.size() / tellerWorkQueue.size() > 2) {
				if(tellerRestQueue.size()>0){
					Teller t = tellerRestQueue.take();
					t.goBackToWork();
					tellerWorkQueue.put(t);
				}else{
					assignNewTeller();
				}
			}else if (customerQueue.size() / tellerWorkQueue.size() < 2) {
				Teller t=tellerWorkQueue.take();
				t.takeABreak();
				tellerRestQueue.put(t);
			}
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	private void assignNewTeller(){
		Teller t = new Teller(customerQueue);
		tellerWorkQueue.add(t);
		se.execute(t);
	}
	
}









分享到:
评论

相关推荐

    Java并发编程实践-电子书

    Java并发编程实践-电子书-01章.pdf Java并发编程实践-电子书-02章.pdf Java并发编程实践-电子书-03章.pdf Java并发编程实践-电子书-04章.pdf Java并发编程实践-电子书-05章.pdf Java并发编程实践-电子书-06章.pdf ...

    62-Java并发编程实战

    62-Java并发编程实战62-Java并发编程实战62-Java并发编程实战62-Java并发编程实战62-Java并发编程实战62-Java并发编程实战62-Java并发编程实战62-Java并发编程实战62-Java并发编程实战62-Java并发编程实战62-Java...

    Java并发编程---synchronized关键字

    Java并发编程---synchronized关键

    JAVA并发编程实践-中文-高清-带书签-完整版

    《JAVA并发编程实践》是Java开发人员深入理解并发编程的一本经典著作,由Doug Lea撰写,本书中文版高清完整,包含丰富的书签,便于读者查阅和学习。这本书旨在帮助开发者掌握在Java平台上进行高效、安全并发编程的...

    高并发编程资料-java

    高并发编程资料-springboot、高并发 适用于学生及工作后的人员

    Java并发编程实践-电子书-09章.pdf

    Java并发编程实践-电子书-09章.pdf

    go 并发编程实战-郝林

    《Go并发编程实战》是郝林撰写的一本深入解析Go语言并发编程的书籍,它以其深入浅出的讲解和丰富的实战示例深受程序员喜爱。在Go语言中,并发编程是其核心特性之一,也是实现高性能服务的关键技术。下面将详细讨论这...

    Java并发编程常识-梁飞.rar

    Java并发编程是Java开发中的重要领域,特别是在多核处理器和分布式系统中,高效地利用并发可以极大地提升程序的性能和响应速度。阿里大牛梁飞编写的《Java并发编程常识》PPT,深入浅出地讲解了这个主题,对开发者来...

    Java并发编程实践-电子书1-9章pdf

    《Java并发编程实践》是Java开发者深入理解并发编程的重要参考资料,尤其对于想要提升多线程应用设计和性能优化技能的程序员来说,这本书提供了丰富的实践经验和深入的理论知识。以下是根据提供的章节内容概述的一些...

    java并发编程1-9

    java并发编程1-9,可解压,并发编程必看资料。 1 Java 并发编程实践基础 2 构建线程安全应用程序 3 使用JDK 并发包构建程序 4 使用开源软件 Amino 构建并发应用程序 5 数据冲突及诊断工具MTRAT 6 死锁 7 显示锁 ...

    Java并发编程实践--电子书.rar

    《Java并发编程实践》这本书是Java开发者深入理解并发编程的重要参考资料。并发编程是现代软件开发中的核心技能之一,尤其是在多核处理器普及后,利用多线程进行并发处理已经成为提升程序性能的关键技术。这本书深入...

    并发编程-事件驱动模型1

    【并发编程-事件驱动模型1】 并发编程是现代软件开发中的关键组成部分,它允许程序同时处理多个任务,提高系统的效率和响应性。事件驱动模型是一种常见的并发编程模型,尤其适用于网络服务器和用户界面(UI)应用...

    Java并发编程1-9章

    Java并发编程Java并发编程Java并发编程Java并发编程Java并发编程Java并发编程Java并发编程Java并发编程Java并发编程Java并发编程Java并发编程Java并发编程Java并发编程Java并发编程Java并发编程Java并发编程Java并发...

    阿里专家级并发编程架构师课程 彻底解决JAVA并发编程疑难杂症 JAVA并发编程高级教程

    阿里专家级并发编程架构师级课程,完成课程的学习可以帮助同学们解决非常多的JAVA并发编程疑难杂症,极大的提高JAVA并发编程的效率。课程内容包括了JAVA手写线程池,UC线程池API详解,线程安全根因详解,锁与原子类...

    java高级技术JUC高并发编程教程2021(1.5G)

    java高级技术JUC高并发编程教程2021(1.5G) 〖课程介绍〗: java高级技术JUC高并发编程教程2021(1.5G) 〖课程目录〗:   01-JUC高并发编程-课程介绍.mp4 02-JUC高并发编程-JUC概述和进程线程概念(1).mp4 03-JUC...

Global site tag (gtag.js) - Google Analytics