黑馬程序員-銀行模擬

 

------- <a href="http://www.itheima.com" target="blank">android培訓</a>、<a href="http://www.itheima.com" target="blank">java培訓</a>、期待與您交流! ----------

有三種對應類型的客戶:VIP客戶,普通客戶,快速客戶 ,異步隨機生成各種類型的客戶,各類型客戶在其對應窗口按順序依次辦理業務 。

本系統一共要產生三個號碼管理器對象,各自管理一類用戶的排隊號碼。這三個號碼管理器對象統一由一個號碼機器進行管理,這個號碼機器在整個系統中始終只能有一個,所以,它要被設計成單例。

各類型客戶在其對應窗口按順序依次辦理業務即叫號.

 

NumberManager類
定義一個用於存儲上一個客戶號碼的成員變量和用於存儲所有等待服務的客戶號碼的隊列集合

 

 

Java代碼 複製代碼 收藏代碼
  1. public class NumberManager {   
  2.     private int lastNumber=1;   
  3.     private List<Integer> queueNumber=new ArrayList<Integer>();   
  4.     public synchronized Integer generateNewManager(){   
  5.         queueNumber.add(lastNumber);   
  6.         return lastNumber++;   
  7.     }   
  8.     public synchronized Integer fetchServiceNumber(){   
  9.         Integer number=null;   
  10.         if(queueNumber.size()>0){   
  11.         number= queueNumber.remove(0);    
  12.         }   
  13.         return number;   
  14.     }   
  15. }  
public class NumberManager {
	private int lastNumber=1;
	private List<Integer> queueNumber=new ArrayList<Integer>();
	public synchronized Integer generateNewManager(){
		queueNumber.add(lastNumber);
		return lastNumber++;
	}
	public synchronized Integer fetchServiceNumber(){
		Integer number=null;
		if(queueNumber.size()>0){
		number= queueNumber.remove(0); 
		}
		return number;
	}
}

 

 

 

 

NumberMachine類
定義三個成員變量分別指向三個NumberManager對象,分別表示普通、快速和VIP客戶的號碼管理器,定義三個對應的方法來返回這三個NumberManager對象。

 

Java代碼 複製代碼 收藏代碼
  1. public class NumberMachine {   
  2.     private NumberManager commonManager=new NumberManager();   
  3.     private NumberManager vipManager=new NumberManager();   
  4.     private NumberManager expressManager=new NumberManager();   
  5.        
  6.     public NumberManager getCommonManager() {   
  7.         return commonManager;   
  8.     }   
  9.     public NumberManager getVipManager() {   
  10.         return vipManager;   
  11.     }   
  12.     public NumberManager getExpressManager() {   
  13.         return expressManager;   
  14.     }   
  15.     private NumberMachine(){}   
  16.     private static NumberMachine instance=new NumberMachine();   
  17.     public static NumberMachine getInstance(){   
  18.         return instance;   
  19.     }   
  20.        
  21. }  
public class NumberMachine {
	private NumberManager commonManager=new NumberManager();
	private NumberManager vipManager=new NumberManager();
	private NumberManager expressManager=new NumberManager();
	
	public NumberManager getCommonManager() {
		return commonManager;
	}
	public NumberManager getVipManager() {
		return vipManager;
	}
	public NumberManager getExpressManager() {
		return expressManager;
	}
	private NumberMachine(){}
	private static NumberMachine instance=new NumberMachine();
	public static NumberMachine getInstance(){
		return instance;
	}
	
}

 

 

 

CustomerType枚舉類
系統中有三種類型的客戶,所以用定義一個枚舉類,其中定義三個成員分別表示三種類型的客戶

 

Java代碼 複製代碼 收藏代碼
  1. public enum CustomerType {   
  2.     COMMON,EXPRESS,VIP;   
  3.        
  4.     public String toString(){   
  5.         switch(this){   
  6.         case COMMON:   
  7.             return "普通";   
  8.         case EXPRESS:   
  9.             return "快速";   
  10.         case VIP:   
  11.             return "VIP";   
  12.         }   
  13.         return null;   
  14.     }   
  15. }  
public enum CustomerType {
	COMMON,EXPRESS,VIP;
	
	public String toString(){
		switch(this){
		case COMMON:
			return "普通";
		case EXPRESS:
			return "快速";
		case VIP:
			return "VIP";
		}
		return null;
	}
}

 

 

 

ServiceWindow類
定義一個start方法,內部啓動一個線程,根據服務窗口的類別分別循環調用三個不同的方法。

 

Java代碼 複製代碼 收藏代碼
  1. public class ServiceWindow {   
  2.     private CustomerType type=CustomerType.COMMON;   
  3.     private int windowId=1;   
  4.        
  5.     public void setType(CustomerType type) {   
  6.         this.type = type;   
  7.     }   
  8.     public void setWindowId(int windowId) {   
  9.         this.windowId = windowId;   
  10.     }   
  11.        
  12.     public void start(){   
  13.         Executors.newSingleThreadExecutor().execute(   
  14.                 new Runnable(){   
  15.                     public void run(){   
  16.                         while(true){   
  17.                             //NumberMachine.getInstance().getCommonManager();  
  18.                         switch(type){   
  19.                         case COMMON:   
  20.                             commonService();   
  21.                         case EXPRESS:   
  22.                             expressService();   
  23.                         case VIP:   
  24.                             vipService();   
  25.                         }   
  26.                         }   
  27.                     }   
  28.                 }   
  29.         );   
  30.     }   
  31.        
  32.     private void commonService(){   
  33.         String windowName="第"+windowId+"號"+type+"窗口";   
  34.         System.out.println(windowName+"正在取號");   
  35.         Integer number=NumberMachine.getInstance().getCommonManager().fetchServiceNumber();   
  36.         if(number!=null){   
  37.             System.out.println(windowName+"爲第"+number+"個普通客戶服務");   
  38.             long beginTime=System.currentTimeMillis();   
  39.             int maxRandom=Constants.MAX_SERVICE_TIME-Constants.MIN_SERVICE_TIME;   
  40.             long serverTime=new Random().nextInt(maxRandom) +1+Constants.MIN_SERVICE_TIME;   
  41.             try {   
  42.                 Thread.sleep(serverTime);   
  43.             } catch (InterruptedException e) {   
  44.                 e.printStackTrace();   
  45.             }   
  46.             long costTime=System.currentTimeMillis()-beginTime;   
  47.             System.out.println(windowName+"爲第"+number+"個普通客戶完成服務,耗時"+costTime/1000+"秒");   
  48.                
  49.         }else{   
  50.             System.out.println("沒有取到任務,先休息一秒鐘!");   
  51.             try {   
  52.                 Thread.sleep(1000);   
  53.             } catch (InterruptedException e) {   
  54.                 e.printStackTrace();   
  55.             }   
  56.         }   
  57.     }   
  58.        
  59.     private void expressService(){   
  60.             String windowName="第"+windowId+"號"+type+"窗口";   
  61.             System.out.println(windowName+"正在取號");   
  62.             Integer number=NumberMachine.getInstance().getExpressManager().fetchServiceNumber();   
  63.             if(number!=null){   
  64.                 System.out.println(windowName+"爲第"+number+"個"+type+"客戶服務");   
  65.                 long beginTime=System.currentTimeMillis();   
  66.                 //int maxRandom=Constants.MAX_SERVICE_TIME-Constants.MIN_SERVICE_TIME;  
  67.                 //long serverTime=new Random().nextInt(maxRandom) +1+Constants.MIN_SERVICE_TIME;  
  68.                    
  69.                 try {   
  70.                     Thread.sleep(Constants.MIN_SERVICE_TIME);   
  71.                 } catch (InterruptedException e) {   
  72.                     e.printStackTrace();   
  73.                 }   
  74.                 long costTime=System.currentTimeMillis()-beginTime;   
  75.                 System.out.println(windowName+"爲第"+number+"個"+type+"客戶完成服務,耗時"+costTime/1000+"秒");   
  76.                    
  77.             }else{   
  78.                 System.out.println(windowName+"沒有取到任務!");   
  79.                 commonService();   
  80.             }   
  81.     }   
  82.        
  83.     private void vipService(){   
  84.         String windowName="第"+windowId+"號"+type+"窗口";   
  85.         System.out.println(windowName+"正在取號");   
  86.         Integer number=NumberMachine.getInstance().getVipManager().fetchServiceNumber();   
  87.         if(number!=null){   
  88.             System.out.println(windowName+"爲第"+number+"個"+type+"客戶服務");   
  89.             long beginTime=System.currentTimeMillis();   
  90.             int maxRandom=Constants.MAX_SERVICE_TIME-Constants.MIN_SERVICE_TIME;   
  91.             long serverTime=new Random().nextInt(maxRandom) +1+Constants.MIN_SERVICE_TIME;   
  92.             try {   
  93.                 Thread.sleep(serverTime);   
  94.             } catch (InterruptedException e) {   
  95.                 e.printStackTrace();   
  96.             }   
  97.             long costTime=System.currentTimeMillis()-beginTime;   
  98.             System.out.println(windowName+"爲第"+number+"個"+type+"客戶完成服務,耗時"+costTime/1000+"秒");   
  99.                
  100.         }else{   
  101.             System.out.println(windowName+"沒有取到任務!");   
  102.             commonService();   
  103.         }   
  104.     }   
  105. }  
public class ServiceWindow {
	private CustomerType type=CustomerType.COMMON;
	private int windowId=1;
	
	public void setType(CustomerType type) {
		this.type = type;
	}
	public void setWindowId(int windowId) {
		this.windowId = windowId;
	}
	
	public void start(){
		Executors.newSingleThreadExecutor().execute(
				new Runnable(){
					public void run(){
						while(true){
							//NumberMachine.getInstance().getCommonManager();
						switch(type){
						case COMMON:
							commonService();
						case EXPRESS:
							expressService();
						case VIP:
							vipService();
						}
						}
					}
				}
		);
	}
	
	private void commonService(){
		String windowName="第"+windowId+"號"+type+"窗口";
		System.out.println(windowName+"正在取號");
		Integer number=NumberMachine.getInstance().getCommonManager().fetchServiceNumber();
		if(number!=null){
			System.out.println(windowName+"爲第"+number+"個普通客戶服務");
			long beginTime=System.currentTimeMillis();
			int maxRandom=Constants.MAX_SERVICE_TIME-Constants.MIN_SERVICE_TIME;
			long serverTime=new Random().nextInt(maxRandom) +1+Constants.MIN_SERVICE_TIME;
			try {
				Thread.sleep(serverTime);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			long costTime=System.currentTimeMillis()-beginTime;
			System.out.println(windowName+"爲第"+number+"個普通客戶完成服務,耗時"+costTime/1000+"秒");
			
		}else{
			System.out.println("沒有取到任務,先休息一秒鐘!");
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
	
	private void expressService(){
			String windowName="第"+windowId+"號"+type+"窗口";
			System.out.println(windowName+"正在取號");
			Integer number=NumberMachine.getInstance().getExpressManager().fetchServiceNumber();
			if(number!=null){
				System.out.println(windowName+"爲第"+number+"個"+type+"客戶服務");
				long beginTime=System.currentTimeMillis();
				//int maxRandom=Constants.MAX_SERVICE_TIME-Constants.MIN_SERVICE_TIME;
				//long serverTime=new Random().nextInt(maxRandom) +1+Constants.MIN_SERVICE_TIME;
				
				try {
					Thread.sleep(Constants.MIN_SERVICE_TIME);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				long costTime=System.currentTimeMillis()-beginTime;
				System.out.println(windowName+"爲第"+number+"個"+type+"客戶完成服務,耗時"+costTime/1000+"秒");
				
			}else{
				System.out.println(windowName+"沒有取到任務!");
				commonService();
			}
	}
	
	private void vipService(){
		String windowName="第"+windowId+"號"+type+"窗口";
		System.out.println(windowName+"正在取號");
		Integer number=NumberMachine.getInstance().getVipManager().fetchServiceNumber();
		if(number!=null){
			System.out.println(windowName+"爲第"+number+"個"+type+"客戶服務");
			long beginTime=System.currentTimeMillis();
			int maxRandom=Constants.MAX_SERVICE_TIME-Constants.MIN_SERVICE_TIME;
			long serverTime=new Random().nextInt(maxRandom) +1+Constants.MIN_SERVICE_TIME;
			try {
				Thread.sleep(serverTime);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			long costTime=System.currentTimeMillis()-beginTime;
			System.out.println(windowName+"爲第"+number+"個"+type+"客戶完成服務,耗時"+costTime/1000+"秒");
			
		}else{
			System.out.println(windowName+"沒有取到任務!");
			commonService();
		}
	}
}

 

Constants類
定義三個常量:MAX_SERVICE_TIME、MIN_SERVICE_TIME、COMMON_CUSTOMER_INTERVAL_TIME

 

 

Java代碼 複製代碼 收藏代碼
  1. public class Constants {   
  2.     public static int MAX_SERVICE_TIME=10000;   
  3.     public static int MIN_SERVICE_TIME=1000;   
  4.     public static int COMMON_CUSTOMER_INTERVAL_TIME=1;   
  5. }  
public class Constants {
	public static int MAX_SERVICE_TIME=10000;
	public static int MIN_SERVICE_TIME=1000;
	public static int COMMON_CUSTOMER_INTERVAL_TIME=1;
}

 

MainClass類
用for循環創建出4個普通窗口,再創建出1個快速窗口和一個VIP窗口。
接着再創建三個定時器,分別定時去創建新的普通客戶號碼、新的快速客戶號碼、新的VIP客戶號碼。

 

 

Java代碼 複製代碼 收藏代碼
  1. public class MainClass {   
  2.     public static void main(String[] args) {   
  3.            
  4.         for(int i=1;i<5;i++){   
  5.         ServiceWindow commonWindow=new ServiceWindow();   
  6.         commonWindow.setWindowId(i);   
  7.         commonWindow.start();   
  8.         }   
  9.            
  10.         ServiceWindow expressWindow=new ServiceWindow();   
  11.         expressWindow.setType(CustomerType.EXPRESS);   
  12.         expressWindow.start();   
  13.            
  14.         ServiceWindow vipWindow=new ServiceWindow();   
  15.         vipWindow.setType(CustomerType.VIP);   
  16.         vipWindow.start();   
  17.            
  18.         Executors.newScheduledThreadPool(1).scheduleAtFixedRate(   
  19.                 new Runnable(){   
  20.                     public void run(){   
  21.                         Integer number=NumberMachine.getInstance().getCommonManager().generateNewManager();   
  22.                         System.out.println(number+"號普通客戶等待服務!");   
  23.                     }   
  24.                 },    
  25.                 0,    
  26.                 Constants.COMMON_CUSTOMER_INTERVAL_TIME,    
  27.                 TimeUnit.SECONDS);   
  28.         Executors.newScheduledThreadPool(1).scheduleAtFixedRate(   
  29.                 new Runnable(){   
  30.                     public void run(){   
  31.                         Integer number=NumberMachine.getInstance().getExpressManager().generateNewManager();   
  32.                         System.out.println(number+"號快速客戶等待服務!");   
  33.                     }   
  34.                 },    
  35.                 0,    
  36.                 Constants.COMMON_CUSTOMER_INTERVAL_TIME *2,    
  37.                 TimeUnit.SECONDS);   
  38.            
  39.         Executors.newScheduledThreadPool(1).scheduleAtFixedRate(   
  40.                 new Runnable(){   
  41.                     public void run(){   
  42.                         Integer number=NumberMachine.getInstance().getVipManager().generateNewManager();   
  43.                         System.out.println(number+"號VIP客戶等待服務!");   
  44.                     }   
  45.                 },    
  46.                 0,    
  47.                 Constants.COMMON_CUSTOMER_INTERVAL_TIME *6,    
  48.                 TimeUnit.SECONDS);   
  49.            
  50.     }   
  51. }  
public class MainClass {
	public static void main(String[] args) {
		
		for(int i=1;i<5;i++){
		ServiceWindow commonWindow=new ServiceWindow();
		commonWindow.setWindowId(i);
		commonWindow.start();
		}
		
		ServiceWindow expressWindow=new ServiceWindow();
		expressWindow.setType(CustomerType.EXPRESS);
		expressWindow.start();
		
		ServiceWindow vipWindow=new ServiceWindow();
		vipWindow.setType(CustomerType.VIP);
		vipWindow.start();
		
		Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
				new Runnable(){
					public void run(){
						Integer number=NumberMachine.getInstance().getCommonManager().generateNewManager();
						System.out.println(number+"號普通客戶等待服務!");
					}
				}, 
				0, 
				Constants.COMMON_CUSTOMER_INTERVAL_TIME, 
				TimeUnit.SECONDS);
		Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
				new Runnable(){
					public void run(){
						Integer number=NumberMachine.getInstance().getExpressManager().generateNewManager();
						System.out.println(number+"號快速客戶等待服務!");
					}
				}, 
				0, 
				Constants.COMMON_CUSTOMER_INTERVAL_TIME *2, 
				TimeUnit.SECONDS);
		
		Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
				new Runnable(){
					public void run(){
						Integer number=NumberMachine.getInstance().getVipManager().generateNewManager();
						System.out.println(number+"號VIP客戶等待服務!");
					}
				}, 
				0, 
				Constants.COMMON_CUSTOMER_INTERVAL_TIME *6, 
				TimeUnit.SECONDS);
		
	}
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章