公告:C1000,请到1号窗口办理,估计用时48秒。
公告:普通客户C1000进入银行。
公告:V1000,请到VIP窗口办理,估计用时31秒。
公告:vip客户V1000进入银行。
公告:C1001,请到2号窗口办理,估计用时18秒。
公告:普通客户C1001进入银行。
公告:快速客户R1000进入银行。
公告:C1002,请到3号窗口办理,估计用时18秒。
公告:普通客户C1002进入银行。
公告:C1003,请到4号窗口办理,估计用时39秒。
公告:普通客户C1003进入银行。
公告:快速客户R1001进入银行。
公告:C1004,请到快速窗口办理,估计用时15秒。
公告:普通客户C1004进入银行。
公告:快速客户R1002进入银行。
2号窗口:C1001业务办理完毕。
公告:快速客户R1003进入银行。
公告:普通客户C1005进入银行。
公告:C1005,请到2号窗口办理,估计用时36秒。
3号窗口:C1002业务办理完毕。
公告:普通客户C1006进入银行。
公告:C1006,请到3号窗口办理,估计用时47秒。
VIP窗口:V1000业务办理完毕。
公告:普通客户C1007进入银行。
快速窗口:C1004业务办理完毕。
公告:R1000,请到快速窗口办理,估计用时15秒。
公告:普通客户C1008进入银行。
公告:C1007,请到VIP窗口办理,估计用时17秒。
公告:普通客户C1009进入银行。
公告:vip客户V1001进入银行。
公告:快速客户R1004进入银行。
1号窗口:C1000业务办理完毕。
公告:C1008,请到1号窗口办理,估计用时44秒。
公告:普通客户C1010进入银行。
快速窗口:R1000业务办理完毕。
公告:R1001,请到快速窗口办理,估计用时15秒。
不要以为进了银行,上面是本期优雅代码所实现的功能。其中:
C = common customer R = rapid customer V = vip customer.
一般情况下,不同类型的窗口接应不同类型的客户。Vip与快速窗口空闲时可接受普通客户。
实现这个系统很难吗?Not at all,after reading this article ,you can!
好了,闲话休提,看下这个系统的用法:
public static void main(String[] args) {
Bank bank = Bank.getInstance();
bank.open();
}
public void open(){
for(int i = 1; i < 5 ; i++){
new CommonCounter(i + "号窗口").start();
}
new RapidCounter("快速窗口").start();
new VipCounter("VIP窗口").start();
......
}
由代码可知,银行开门时开了4个普通窗口,一个快速窗口,一个VIP窗口。这些窗口都是独立的线程。考虑到窗口的共性,可抽象出一个基类:
public abstract class Counter extends Thread{
protected String name;
protected Bank bank = Bank.getInstance();
protected boolean working = false;
public Counter(String name){
this.name = name;
}
public void run(){
working = true;
while(working){
String cust = callCust();
long needTime = genProcessTime();
System.out.println(new StringBuffer().append("公告:").append(cust).append(",")
.append("请到").append(name).append("办理,估计用时").
append(needTime).append("秒。"));
try {
Thread.sleep(needTime * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(new StringBuffer().append(name)
.append(":").append(cust).append("业务办理完毕。"));
}
}
protected abstract String callCust();
protected abstract long genProcessTime();
}
看清楚了吗,这个基类完成了呼叫的主要逻辑,其中有两个抽象方法,留给不同的特殊窗口去实现。一个是呼叫客户的规则callCust,一个是窗口处理时间的评估函数。特殊窗口的代码?留给聪明的你了。
OK,下面请出这个系统的主角:
BlockingQueue
是不是有点陌生,是就去翻下api了。这个东西有两个特长,线程安全与阻塞,有了这个实力派主角,什么生产者消费者模型都可以轻松实现。
上面这句话已经点题了,啊?生产什么?消费什么?
生产客户,消费客户!
我们为三种客户排个队吧:
BlockingQueue<String> commonCusts = new ArrayBlockingQueue<String>(10);
BlockingQueue<String> rapidCusts = new ArrayBlockingQueue<String>(10);
BlockingQueue<String> vipCusts = new ArrayBlockingQueue<String>(10);
现在已经很明朗了,如何生产客户,请听下回分解。
分享到:
相关推荐
本压缩包包含的代码涉及到了操作系统中的几个关键概念:进程调度、页面调度、银行家算法以及磁头选择算法。这些算法在操作系统中扮演着至关重要的角色。 1. **进程调度**:在多任务操作系统中,进程调度是决定哪个...
- **电梯调度算法**:例如,银行家算法(Banker's Algorithm),避免电梯(或系统)陷入死锁。 3. **MFC(Microsoft Foundation Classes)**:在VS2005下,项目使用MFC框架来实现。MFC是微软提供的一套面向对象的...
根据给定的信息,本文将详细解释如何在单道处理系统中实现作业调度模拟程序,并针对先来先服务(First-Come First-Served, FCFS)、最短作业优先(Shortest Job First, SJF)、响应比高者优先(Highest Response ...
2.支持 FCFS 、短 作业优先以及时间片调度算法。 3.能够较方便地查看调度过程及平均周转时间、平均带权周转时 间。 4.支持优先权调度算法与其它算法相结合的调度模式。 5.调度时应适当输出调度过程中各进程状态队列...
【操作系统课程设计——作业调度模拟】是通信工程专业学生在学习操作系统课程后进行的一次重要实践,旨在深化对操作系统基本理论的理解,特别是掌握作业调度算法。设计任务包括使用高级编程语言实现作业调度模拟,...
本实验报告将探讨两个关键概念:作业调度和银行家算法,并通过Java编程语言进行实现。Java是一种广泛使用的、跨平台的面向对象编程语言,具有丰富的类库和强大的功能,非常适合进行系统级编程。 首先,我们来理解...
"操作系统导论课后作业代码"通常会涵盖操作系统的基本概念、原理以及实现方法,通过编程实践帮助学生深入理解操作系统的运作机制。下面我们将详细探讨一些可能涉及的操作系统知识点。 1. 进程管理:操作系统中的...
作业调度采用FCFS、SJF、响应比高者优先算法模拟设计作业调度程序。 [提示]: (1)每个作业的JCB中包括作业名、提交时刻、要求运行时间; (2)假设第一个作业提交时,系统中无正在执行的作业,即第一个作业一提交...
通过学习这个教程,你不仅可以掌握银行业务调度系统的基本原理,还能提升在实际项目中的开发技能,例如需求分析、系统设计、代码编写、测试和维护等。对于想要从事银行IT领域或者提升现有系统的人来说,这是一份非常...
在这个特定的“操作系统课程作业”中,重点在于电梯调度算法的实现,这是操作系统管理并发进程的一个经典案例。电梯调度是为了优化建筑物中电梯的运行效率,确保乘客等待时间尽可能短,同时保证电梯的高效运行。 在...
操作系统实验作业合集源码+项目说(作业调度+进程调度+银行家算法+缺页中断+SPOOLing技术等).zip操作系统实验作业合集源码+项目说(作业调度+进程调度+银行家算法+缺页中断+SPOOLing技术等).zip操作系统实验作业...
其中,高级调度(也称为作业调度),决定哪些作业将被加载到内存中;中级调度(有时称为交换或页面置换),涉及将进程从内存移动到磁盘或反之亦然;低级调度(即进程调度),负责选择下一个要执行的就绪进程。 **死锁**是...
银行家算法和作业调度算法是计算机系统中用于资源分配和管理的重要策略,它们在多任务环境中确保系统的稳定性与效率。本项目是用Java语言实现的这两种算法,旨在帮助学习者理解其工作原理并能实际应用。 银行家算法...
在这个操作系统大作业中,我们将深入探讨三个重要的概念:进程调度、银行家算法和页面置换,这些都是操作系统中至关重要的内存管理和资源分配策略。 首先,我们来详细了解一下**进程调度**。在多任务操作系统中,...
在这个课程设计中,我们将聚焦于操作系统中的三个关键调度算法:磁盘调度、进程调度和页面置换,这些都是操作系统管理资源的重要手段。 首先,磁盘调度算法在操作系统中扮演着关键角色,它的主要任务是决定硬盘读写...
操作系统中的银行家算法是一种用于预防死锁的策略,它...通过这个实验,学生可以深入理解银行家算法的原理,学习如何通过编程实现资源管理,预防死锁的发生,这对于理解和应用操作系统中的并发控制和资源调度至关重要。
操作系统是计算机系统的核心组成部分,它负责管理系统...通过分析和修改这些代码,你可以深入理解操作系统进程调度的工作原理,并提升C/C++编程能力。记住,理解和实践这些知识对于成为一名优秀的IT专业人员至关重要。
8. **实验与分析**:实际编写代码实现进程调度系统,然后通过模拟或真实环境测试其性能,对比不同调度算法的结果。 9. **文档编写**:在提供的Word文档中,你需要详细记录你的设计思路、实现方法以及实验结果,这有...
在操作系统的设计与实现中,有三个重要的算法:银行家算法、进程调度算法和页面置换算法。这些算法对于系统的性能和稳定性至关重要。 首先,让我们深入探讨银行家算法。这个算法主要用于预防操作系统的死锁问题。...