知识点总结:
(1)for(Window win:Window.values())//枚举有一个values方法,可以返回包含枚举所有元素的数组
{
if(win.queueLength()==0)
{ win.addGuest(person);
break;
}
}
(2)String ex="COMMON_1";
System.out.println(ex.substring(0, ex.indexOf("_")));//截取“_”之前的子字符串
(3)
接口Iterable
实现此接口或其子接口的集合类对象,可以用增强for迭代
接口Collection
其父接口是Iterable,
允许重复元素,对象元素之间没有指定顺序
其实现类(常用)有:ArrayList,Vector,HashSet:用于动态的存放对象
接口List:
其父接口是Collection
允许重复元素,对象之间有指定顺序
其实现类(常用)有:ArrayList,Vector:
接口Set:
其父接口是Collection
不允许重复元素,对象元素之间没有指定顺序。更确切地讲, set 不包含满足 e1.equals(e2)
的元素对 e1
和 e2
其实现类(常用)有: HashSet
接口 Map
将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值
即不允许重复存记录,且元素记录间无顺序
内部有子接口:Map.Entry<K,V>
有方法(常用):
Set<Map.Entry<K,V>> entrySet()
返回此映射中包含的映射关系的 Set 视图。该 set 受映射支持,所以对映射的更改可在此set 中反映出来,反之亦然。如果对该 set (可用增强的for功能迭代)进行迭代的同时修改了映射(通过迭代器自己的 remove 操作,或者通过对迭代器返回的映射项执行 setValue 操作除外),则迭代结果是不确定的。set 支持元素移除,通过Iterator.remove、Set.remove、removeAll、retainAll 和 clear 操作可从映射中移除相应的映射关系。它不支持 add 或 addAll 操作。
其实现的子类:HashMap,Hashtable,Properties
(4)线程池
线程池作用就是设置系统中执行线程的数量。
根据系统的环境情况,可以自动或手动设置线程数量,达到运行的最佳效果;少了浪费了系统资源,多了造成系统拥挤效率不高。用线程池控制线程数量,其他线程排队等候。一个任务执行完毕,再从队列的中取最前面的任务开始执行。若队列中没有等待进程,线程池的这一资源处于等待。当一个新任务需要运行时,如果线程池中有等待的工作线程,就可以开始运行了;否则进入等待队列。
为什么要用线程池:
1.减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务
2.可以根据系统的承受能力,调整线程池中工作线线程的数目,防止因为因为消耗过多的内存,而把服务器累趴下(每个线程需要大约1MB内存,线程开的越多,消耗的内存也就越大,最后死机)。
银行调度系统思路:
(1)确定需要哪几个对象:号码管理器,号码控制器,业务窗口。
号码管理器生成三种类型的客户,因为三种客户都是相对独立的,且客户比例不同,则,需要三种号码管理器来生成。生成号码给客户后
(2)传递一个信息给业务窗口,提醒窗口有多少个号码生成了,可以叫号了。
(3) 业务窗口分成三种,普通,快速,vip。则可以设计成三个这样的方法。根据传递的参数来分别对应接受三种客户。
分别编写号码管理器类、管理号码管理器的号码机器类和服务窗口类
NumberManager类
定义一个用于存储上一个客户号码的成员变量和用于存储所有等待服务的客户号码的队列集合。
定义一个产生新号码的方法和获取马上要为之服务的号码的方法,这两个方法被不同的线程操作了相同的数据,所以,要进行同步。
NumberMachine类
定义三个成员变量分别指向三个NumberManager对象,分别表示普通、快速和VIP客户的号码管理器,定义三个对应的方法来返回这三个NumberManager对象。
将NumberMachine类设计成单例
CustomerType枚举类
系统中有三种类型的客户,所以用定义一个枚举类,其中定义三个成员分别表示三种类型的客户。
重写toString方法,返回类型的中文名称。这是在后面编码时重构出来的,刚开始不用考虑。
ServiceWindow类
定义一个start方法,内部启动一个线程,根据服务窗口的类别分别循环调用三个不同的方法。
定义三个方法分别对三种客户进行服务,为了观察运行效果,应详细打印出其中的细节信息。