---------------------- android培训、java培训、期待与您交流! ----------------------
面向对象的分析:有三种类型的客户,VIP、普通和快速;异步随机生成各种类型的客户;各种类型客户在其对应窗口按顺序依次办理业务。
1.NumberManager号码管理器,负责产生号码和取号,这两个号码要用不同的线程操作,同时先取到号码的客户先进行服务,所以两个线程要同步
package horse;
import java.util.ArrayList;
import java.util.List;
/**这个类负责生产号码和取号
*/
public class NumberManager {
private int lastNumber = 1;
//排队号码
private List<Integer> queueNumber = new ArrayList<Integer>();
//生产一个号码
public synchronized Integer generageNewManager() {
queueNumber.add(lastNumber);
return lastNumber++;
}
//取号
public synchronized Integer fetchServiceNumber() {
return queueNumber.remove(0);
}
}
2.号码管理器类NumberMachine,负责三类客户号码管理,一个银行业务系统只有一个号码机器,所以要设计为单利模式
package horse;
/**这个类负责三类客户号码管理
*/
public class NumberMachine {
//创建一个普通用户
private NumberManager commonManager = new NumberManager();
//创建一个快速用户
private NumberManager expressManager = new NumberManager();
//创建一个vip用户
private NumberManager vipManager = new NumberManager();
//普通用户的get、set方法
public NumberManager getCommonManager() {
return commonManager;
}
public void setCommonManager(NumberManager commonManager) {
this.commonManager = commonManager;
}
//快速用户的get、set方法
public NumberManager getExpressManager() {
return expressManager;
}
public void setExpressManager(NumberManager expressManager) {
this.expressManager = expressManager;
}
//vip用户的get、set方法
public NumberManager getVipManager() {
return vipManager;
}
public void setVipManager(NumberManager vipManager) {
this.vipManager = vipManager;
}
private NumberMachine() {
super();
}
//创建一个实例
public static NumberManager getInstance(){
return instance;
}
private static NumberManager instance = new NumberManager();
}
3. 服务窗口类(ServiceWindow)及其相关
CustomerType类用枚举的方法列出三类人群,需要重写toString()方法,返回中文名名称。
package horse;
/**这是一个枚举用户列出三类人群
* 另重写toString()方法,返回中文名
*/
public enum CustomerType {
COMMON,EXPRESS,VIP;
public String toString(){
String name = null;
switch(this){
case COMMON: name ="普通";break;
case EXPRESS: name = "快速";break;
case VIP: name = name();break;
}
return name;
}
}
Constants用于设置客户所需服务的时间,分为最大值和最小值
package horse;
/**用于设置客户所需服务的时间,分为最大值和最小值
*/
public class Constants {
public static int MAX_SERVICE_TIME = 10000; //10秒!
public static int MIN_SERVICE_TIME = 1000; //1秒!
public static int COMMON_CUSTOMER_INTERVAL_TIME = 1;
}
服务窗口类ServiceWindow,负责处理叫号
package horse;
import java.util.Random;
import java.util.concurrent.Executors;
/**定义三种方法为为三类客户服务
* 其中用到了Constants类(用于设置客户所需服务的时间)
* 用到了NumberManager中的方法
*/
public class ServiceWindow {
//private static Logger = Logger.getLogger
private CustomerType type = CustomerType.COMMON;
private int windowId = 1;
//普通用户的服务函数
private void commonService(){
String windowName = "第"+windowId+"号"+type+"窗口";
System.out.println(windowName+"开始获取普通任务");
//Integer number = NumberManager.getInstance().getCommonManager().fetchNumber();
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 = "第"+windowId+"号"+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();
}
}
//vip用户的服务函数
private void vipService(){
Integer serviceNumber = NumberMachine.getInstance().getVipManager().fetchNumber();
String windowName = "第"+windowId+"号"+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();
}
}
//启动了一个单线程
public void start(){
Executors.newSingleThreadExecutor().execute(new Runnable(){
public void run(){
while(true){
switch(type){
case COMMON: commonService();break;
case EXPRESS: expressService();break;
case VIP: vipService();break;
}
}
}
});
}
public int getWindowId() {
return windowId;
}
public void setWindowId(int windowId) {
this.windowId = windowId;
}
public CustomerType getType() {
return type;
}
public void setType(CustomerType type) {
this.type = type;
}
}
4测试类(MainClas)
package horse;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
/**用于测试
*/
public class MainTest {
public static void main(String[] args) {
//产生4个普通窗口
for(int i=1;i<5;i++){
//创建一个服务窗口
ServiceWindow window = new ServiceWindow();
window.setWindowId(i);
window.start();
}
//产生一个快速窗口
ServiceWindow expressWindow = new ServiceWindow();
expressWindow.setType(CustomerType.EXPRESS);
expressWindow.start();
//产生一个vip窗口
ServiceWindow vipWindow = new ServiceWindow();
vipWindow.setType(CustomerType.VIP);
vipWindow.start();
//普通客户拿号
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable(){
public void run(){
Integer serviceNumber = NumberMachine.getInstance().getCommonManager().generageNewManager();
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().generageNewManager();
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);
}
}
感受:直至今天我的文章终于写完了,写完并不代表我都会了,确切的说我是把相关的基础知识加上配套的代码整理了下,本来还想写awt的,可怕来不及,就留到以后整理了。在此也很感谢黑马推出的这个平台,因为这十篇文章里的很多东西(包括代码),都是从论坛以及其他同学的文章借鉴过来的,我不敢居功
---------------------- android培训、java培训、期待与您交流! ----------------------
详细请查看:http://edu.csdn.net/heima