1.有三种客户 VIP客户,普通跟客户 快速客户,异步随即生成各种类型的客户,各类型客户在对应窗口按顺序依次办理业务
2.人们取号,变成客户 因此可以号码管理器对象
因为有三类客户,所以要产生三个号码管理器对象,这三个号码管理器对象由一个号码机器进行管理,这个号码机器在整个系统中只能有一个,它被设计成单例。
3.窗口依次叫号
服务窗口每次找号码管理器获取当前要被服务的号码
4.NumberManager
List<Integer> queueNumber=new ArrayList<Integer> ();
使用
return queueNumber.remove(0); 很爽 因为remove的返回值为干掉的元素
5.NumberMachine
产生3个NumberManager commonManager expressManager
单例 private 构造函数
private static NumberMachine instance=new NumberMachine();
public static NumberMachine getInstance()
{
return instance;
}
6.ServerWindow
Executors.newSingleThreadExecutor()建立一个新的线程池
Executors.newSingleThreadExecutor().execute(
new Runnable(){
public void run(){}});
switch的数据类型可以有哪些:
switch(type)
{
case COMMON:commonService();break;
case EXPRESS:expressService();break;
case VIP:vipService();break;
}
switch的效率比ifelse效率高
7.大量的复用代码 如果用子类来抽取会提高复用性
内部类当然可以调用本类private方法。。。
将普通窗口,快速窗口和VIP窗口当成窗口的子类
8.public staticScheduledExecutorService newScheduledThreadPool(int corePoolSize)
corePoolSize - 池中所保存的线程数,即使线程是空闲的也包括在内。
package net.csdn;
import java.util.ArrayList;
import java.util.List;
//号码管理
public class NumberManager {
private int lastNumber = 1;
private List<Integer> queueNumbers = newArrayList<Integer>();
//关系到多线程共享数据 所以要上锁
//客户拿号所得号码
public synchronized Integer generateNewNumber()
{
queueNumbers.add(lastNumber++);
return lastNumber;
}
//服务台取号所得号码
public synchronized Integer fetchNumber()
{
if (queueNumbers.size()!=0)
return queueNumbers.remove(0);
return null;
}
}
package net.csdn;
//取号机
public class NumberMachine {
private NumberMachine(){}
private static NumberMachine instance = new NumberMachine();
public static NumberMachine getInstance(){
return instance;
}
private NumberManager commonManager = new NumberManager();
private NumberManager expressManager = new NumberManager();
private NumberManager vipManager = new NumberManager();
public NumberManager getCommonManager() {
return commonManager;
}
public NumberManager getExpressManager() {
return expressManager;
}
public NumberManager getVipManager() {
return vipManager;
}
}
package net.csdn;
//枚举客户
public enum CustomerType {
COMMON,EXPRESS,VIP;
public String toString(){
switch(this){
case COMMON:return"普通";
case EXPRESS:return"快速";
case VIP:return"VIP";
}
return null;
}
}
package net.csdn;
public class Constants {
//final值设定
public static int MAX_SERVICE_TIME = 10000;
public static int MIN_SERVICE_TIME = 1000;
public static int COMMON_CUSTOMER_INTERVAL_TIME = 1;
}
package net.csdn;
import java.util.Random;
import java.util.concurrent.Executors;
//服务台 取号
public class ServiceWindow {
private CustomerType type;
private int number = 1;
public CustomerType getType() {
return type;
}
public void setType(CustomerTypetype) {
this.type = type;
}
public void setNumber(int number){
this.number = number;
}
public void start()
{
Executors.newSingleThreadExecutor().execute(
new Runnable()
{
public void run()
{
while(true)
{
//分别
switch(type)
{
caseCOMMON:commonService();break;
caseEXPRESS:expressService();break;
case VIP:vipService();break;
}
}
}
});
}
private void commonService()
{
String windowName = "第" + number + "号" + type + "窗口";
System.out.println(windowName + "开始获取普通任务!");
Integer serviceNumber =NumberMachine.getInstance().getCommonManager().fetchNumber();
if(serviceNumber != null )
{
System.out.println(windowName + "开始为第" + serviceNumber + "号普通客户服务");
int maxRandom = Constants.MAX_SERVICE_TIME -Constants.MIN_SERVICE_TIME;
int serviceTime = new Random().nextInt(maxRandom)+1 +Constants.MIN_SERVICE_TIME;
try
{
Thread.sleep(serviceTime);
} catch (InterruptedException e)
{
e.printStackTrace();
}
System.out.println(windowName + "完成为第" + serviceNumber + "号普通客户服务,总共耗时" + serviceTime/1000 + "秒");
}else
{
System.out.println(windowName + "没有取到普通任务,正在空闲一秒");
try
{
Thread.sleep(1000);
} catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
private void expressService()
{
Integer serviceNumber =NumberMachine.getInstance().getExpressManager().fetchNumber();
String windowName = "第" + number + "号" + type + "窗口";
System.out.println(windowName + "开始获取快速任务!");
if(serviceNumber !=null)
{
System.out.println(windowName + "开始为第" + serviceNumber + "号快速客户服务");
int serviceTime = Constants.MIN_SERVICE_TIME;
try
{
Thread.sleep(serviceTime);
} catch (InterruptedException e)
{
e.printStackTrace();
}
System.out.println(windowName + "完成为第" + serviceNumber + "号快速客户服务,总共耗时" + serviceTime/1000 + "秒");
}else
{
System.out.println(windowName + "没有取到快速任务!");
commonService();
}
}
private void vipService()
{
Integer serviceNumber =NumberMachine.getInstance().getVipManager().fetchNumber();
String windowName = "第" + number + "号" + type + "窗口";
System.out.println(windowName + "开始获取VIP任务!");
if(serviceNumber !=null)
{
System.out.println(windowName + "开始为第" + serviceNumber + "号VIP客户服务");
int maxRandom = Constants.MAX_SERVICE_TIME -Constants.MIN_SERVICE_TIME;
int serviceTime = new Random().nextInt(maxRandom)+1 +Constants.MIN_SERVICE_TIME;
try
{
Thread.sleep(serviceTime);
} catch (InterruptedException e)
{
e.printStackTrace();
}
System.out.println(windowName + "完成为第" + serviceNumber + "号VIP客户服务,总共耗时" +serviceTime/1000 + "秒");
}else
{
System.out.println(windowName + "没有取到VIP任务!");
commonService();
}
}
}
package net.csdn;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
//生成窗口和客户拿号
public class MainClass {
public static void main(String[]args) {
//产生4个普通窗口
for(int i=1;i<5;i++){
ServiceWindow commonWindow = new ServiceWindow();
commonWindow.setType(CustomerType.COMMON);
commonWindow.setNumber(i);
commonWindow.start();
}
//产生1个快速窗口
ServiceWindow expressWindow = new ServiceWindow();
expressWindow.setType(CustomerType.EXPRESS);
expressWindow.start();
//产生1个VIP窗口
ServiceWindow vipWindow = new ServiceWindow();
vipWindow.setType(CustomerType.VIP);
vipWindow.start();
//普通客户拿号
//一个线程
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
//command
new Runnable(){
public void run(){
Integer serviceNumber =NumberMachine.getInstance().getCommonManager().generateNewNumber();
System.out.println("第" + serviceNumber + "号普通客户正在等待服务!");
}
},
//延迟
0,
//频率
Constants.COMMON_CUSTOMER_INTERVAL_TIME,
//单位
TimeUnit.SECONDS);
//快速客户拿号
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
new Runnable(){
public void run(){
Integer serviceNumber = NumberMachine.getInstance().getExpressManager().generateNewNumber();
System.out.println("第" + serviceNumber + "号快速客户正在等待服务!");
}
},
0,
Constants.COMMON_CUSTOMER_INTERVAL_TIME * 2,
TimeUnit.SECONDS);
//VIP客户拿号
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
new Runnable(){
public void run(){
Integer serviceNumber =NumberMachine.getInstance().getVipManager().generateNewNumber();
System.out.println("第" + serviceNumber + "号VIP客户正在等待服务!");
}
},
0,
Constants.COMMON_CUSTOMER_INTERVAL_TIME * 6,
TimeUnit.SECONDS);
}
}