关闭

黑马程序员Java应用之银行业务调度

标签: javaintegerconstantsserviceexpressstring
169人阅读 评论(0) 收藏 举报
分类:

---------------------- 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

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:37612次
    • 积分:870
    • 等级:
    • 排名:千里之外
    • 原创:52篇
    • 转载:11篇
    • 译文:0篇
    • 评论:6条
    文章分类
    最新评论