这个仿真模型包括如下几个对象:
顾客: 随机的时间间隔出现顾客,每个顾客办理业务的时间也是随机。顾客会排队办理业务。
出纳: 每次选取排在最前面的顾客进行服务,服务时间由顾客的业务时间而定。
出纳经理: 每隔一段时间,查看顾客排队的人数,排队的人多就增加出纳窗口,排队人少的话,就减少出纳窗口,让出纳休息。
通过调整这个模型的参数:
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并发编程实践-电子书-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...
Java并发编程---synchronized关键
《JAVA并发编程实践》是Java开发人员深入理解并发编程的一本经典著作,由Doug Lea撰写,本书中文版高清完整,包含丰富的书签,便于读者查阅和学习。这本书旨在帮助开发者掌握在Java平台上进行高效、安全并发编程的...
高并发编程资料-springboot、高并发 适用于学生及工作后的人员
Java并发编程实践-电子书-09章.pdf
《Go并发编程实战》是郝林撰写的一本深入解析Go语言并发编程的书籍,它以其深入浅出的讲解和丰富的实战示例深受程序员喜爱。在Go语言中,并发编程是其核心特性之一,也是实现高性能服务的关键技术。下面将详细讨论这...
Java并发编程是Java开发中的重要领域,特别是在多核处理器和分布式系统中,高效地利用并发可以极大地提升程序的性能和响应速度。阿里大牛梁飞编写的《Java并发编程常识》PPT,深入浅出地讲解了这个主题,对开发者来...
《Java并发编程实践》是Java开发者深入理解并发编程的重要参考资料,尤其对于想要提升多线程应用设计和性能优化技能的程序员来说,这本书提供了丰富的实践经验和深入的理论知识。以下是根据提供的章节内容概述的一些...
java并发编程1-9,可解压,并发编程必看资料。 1 Java 并发编程实践基础 2 构建线程安全应用程序 3 使用JDK 并发包构建程序 4 使用开源软件 Amino 构建并发应用程序 5 数据冲突及诊断工具MTRAT 6 死锁 7 显示锁 ...
《Java并发编程实践》这本书是Java开发者深入理解并发编程的重要参考资料。并发编程是现代软件开发中的核心技能之一,尤其是在多核处理器普及后,利用多线程进行并发处理已经成为提升程序性能的关键技术。这本书深入...
【并发编程-事件驱动模型1】 并发编程是现代软件开发中的关键组成部分,它允许程序同时处理多个任务,提高系统的效率和响应性。事件驱动模型是一种常见的并发编程模型,尤其适用于网络服务器和用户界面(UI)应用...
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) 〖课程目录〗: 01-JUC高并发编程-课程介绍.mp4 02-JUC高并发编程-JUC概述和进程线程概念(1).mp4 03-JUC...