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