ブラックホースプログラマー-銀行業務スケジューリングシステム

9145 ワード

---------------------- and roid教育javaトレーニング、あなたとの交流を期待しています。
 
 
3種類の対応タイプのお客様がいます。VIPお客様、一般のお客様、快速のお客様、非同期のランダムで様々なタイプのお客様を生成します。各タイプのお客様はその対応窓口で順次業務を行います。
本システムは全部で三つの番号マネージャのオブジェクトを生成し、それぞれ一つの種類のユーザの列番号を管理します。この三つの番号マネージャの対象は一つの番号マシンで管理されています。この番号マシンはシステム全体で一つしかないです。だから、一つの例に設計されます。
各タイプのお客様はその対応窓口で順番に業務を処理します。
 
Number Manager類は、前の顧客番号を記憶するためのメンバー変数と、すべての待機サービスの顧客番号を記憶するためのキューセットを定義します。
 
 
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;
	}
}
 
 
 
 
Number Machine類は、3つのメンバー変数をそれぞれ3つのNumber Managerオブジェクトに指し、それぞれ普通、快速、VIPクライアントの番号マネージャを表し、3つの対応方法を定義して、これらの3つのNumber Managerオブジェクトに戻ります。
 
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;
	}
	
}
 
 
 
CustoomerTypeエニュメレーションシステムには三つのタイプのお客様がいますので、エニュメレート・クラスを定義します。この中で3つのメンバーはそれぞれ3種類のお客様を表します。
 
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方法を定義し、内部でスレッドを起動し、サービスウィンドウの種類によってそれぞれ3つの異なる方法を呼び出す。
 
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();
		}
	}
}
 
Contstantsクラス定義3つの定数:MAX_SERVICE_TIME、MIN_SERVICE_TIME、COMMON_CUSTOMER_INTERVALTIME
 
 
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つの普通のウィンドウを作成し、快速ウィンドウとVIPウィンドウを作成します。次に三つのタイマーを作成して、それぞれのタイミングで新しい一般顧客番号、新しい快速顧客番号、新しいVIP顧客番号を作成します。
 
 
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);
		
	}
}
 
 
 
 
--------------and roid教育javaトレーニング、あなたとの交流を期待します。詳細は、http://edu.csdn.net/heimaを参照してください。