黑馬程式設計師_7K面試題之銀行排程系統
阿新 • • 發佈:2019-01-30
------- android培訓、java培訓、期待與您交流!
----------
Sleep的方式模擬)。各型別客戶在其對應視窗按順序依次辦理業務。當VIP(6號)視窗和快速業務(5號)視窗沒有客戶等待辦理業務的時候,這兩個視窗可以處理普通客戶的業務,而一旦有對應的客戶等待辦理業務的時候,則優先處理對應客戶的業務。隨機生成客戶時間間隔以及業務辦理時間最大值和最小值自定,可以設定。
銀行業務排程系統
1. 模擬實現銀行業務排程系統邏輯,具體需求如下:銀行內有6個業務視窗,1
- 4號視窗為普通視窗,5號視窗為快速視窗,6號視窗為VIP視窗。有三種對應型別的客戶:VIP客戶,普通客戶,快速客戶(辦理如交水電費、電話費之類業務的客戶)。非同步隨機生成各種型別的客戶,生成各型別使用者的概率比例為:
VIP客戶:普通客戶:快速客戶 = 1 :6 :3。客戶辦理業務所需時間有最大值和最小值,在該範圍內隨機設定每個VIP客戶以及普通客戶辦理業務所需的時間,快速客戶辦理業務所需時間為最小值(提示:辦理業務的過程可通過執行緒
不要求實現GUI,只考慮系統邏輯實現,可通過Log方式展現程式執行結果。
2. 思路分析
分析: 有三種對應型別的客戶:VIP客戶,普通客戶,快速客戶,非同步隨機生成各種型別的客戶,各型別客戶在其對應視窗按順序依次辦理業務。其實每一個客戶辦理業務順序的依據是他所取到的號碼。所以要想到定義一個號碼產生器,因為有三種不同型別的客戶,所以要定義一個類來進行著三種客戶進行管理。讓哪個使用者進行辦理業務實際上是視窗進行不斷的叫號,視窗叫號實際上就是想號碼管理器要號。
類的功能程式碼實現出號機類
public class NumberManager { private int number=0; private List<Integer> storeNumber=new ArrayList<Integer>(); //產生票 public synchronized Integer produceNumber() { storeNumber.add(++number); //System.out.println(number+"////////////////"); return number; } //取票 public synchronized IntegerfetchNumber() { if(storeNumber.size()>0) { return (Integer)storeNumber.remove(0); } else { return null; } } }
管理三種不同的號
public class NumberMechine {
private NumberManager commonNumber=new NumberManager();
private NumberManager rapidNumber=new NumberManager();
private NumberManager vipNumber=new NumberManager();
//獲取普通使用者
public NumberManager getCommonNumber() {
return commonNumber;
}
//獲得快速使用者
public NumberManager getRapidNumber() {
return rapidNumber;
}
//獲得VIP使用者
public NumberManager getVipNumber() {
return vipNumber;
}
private NumberMechine(){};
private static NumberMechine numbermechine=new NumberMechine();
public static NumberMechine getInstance()
{
return numbermechine;
}
}
視窗類:
import java.util.Random;
import java.util.concurrent.Executors;
public class Servicewindow {
private ComstorStyle type=ComstorStyle.COMMON;
private int number=1;
public ComstorStylegetType() {
return type;
}
public void setType(ComstorStyle type) {
this.type = type;
}
public void setNumber(int number) {
this.number = number;
}
public void start()
{
Executors.newSingleThreadExecutor().execute(new Runnable(){
@Override
public void run() {
while(true)
{
switch(type)
{
case COMMON:
commonService();
break;
case RAPID:
rapidService();
break;
case VIP:
vipService();
break;
}
}
}
});
}
//快速視窗的服務
private void rapidService() {
//System.out.println(Comstornumber+"======");
String windownumber="第"+number+"號"+type+"視窗";
System.out.println(windownumber+"正在獲取快速使用者!");
Integer Comstornumber=NumberMechine.getInstance().getCommonNumber().fetchNumber();
if(Comstornumber!=null)
{
System.out.println(windownumber+"正在準備為第"+Comstornumber+"號快速使用者服務!");
// longstartTime=System.currentTimeMillis();
//int time= (int)((TimeConstant.TIME_MAX-TimeConstant.TIME_MIN)/1000);
// longworkTime=new Random().nextInt(time)+1+TimeConstant.TIME_MIN/1000;
try {
Thread.sleep(TimeConstant.TIME_MIN);
} catch (InterruptedException e) {
e.printStackTrace();
}
// longendTime=System.currentTimeMillis();
System.out.println(windownumber+"為第"+Comstornumber+"號普快速戶服務完畢!");
}
else
{
System.out.println("快速視窗沒有獲取到快速使用者,正等待為普通使用者服務");
commonService();
System.out.println("快速視窗為普通使用者服務!!");
}
}
//VIP視窗服務
private void vipService() {
String windownumber="第"+number+"號"+type+"視窗";
System.out.println(windownumber+"正在獲取VIP使用者!");
Integer Comstornumber=NumberMechine.getInstance().getCommonNumber().fetchNumber();
// System.out.println(Comstornumber+"----------");
if(Comstornumber!=null)
{
System.out.println(windownumber+"正在準備為第"+Comstornumber+"號VIP使用者服務!");
// longstartTime=System.currentTimeMillis();
int time= (int) ((TimeConstant.TIME_MAX-TimeConstant.TIME_MIN));
long workTime=newRandom().nextInt(time)+1+TimeConstant.TIME_MIN;
try {
Thread.sleep(workTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
// longendTime=System.currentTimeMillis()/1000;
System.out.println(windownumber+"為第"+Comstornumber+"號VIP使用者服務完畢!");
}
else
{
System.out.println("VIP視窗沒有獲取到VIP使用者,正等待為普通使用者服務");
commonService();
System.out.println("VIP視窗為普通使用者服務!!");
}
}
//普通視窗服務
private void commonService() {
String windownumber="第"+number+"號"+type+"視窗";
System.out.println(windownumber+"正在獲取普通使用者!");
Integer Comstornumber=NumberMechine.getInstance().getCommonNumber().fetchNumber();
if(Comstornumber!=null)
{
System.out.println(windownumber+"正在準備為第"+Comstornumber+"號普通使用者服務!");
int time= (int) ((TimeConstant.TIME_MAX-TimeConstant.TIME_MIN));
long workTime=newRandom().nextInt(time)+1+TimeConstant.TIME_MIN;
try {
Thread.sleep(workTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(windownumber+"為第"+Comstornumber+"號普通使用者服務完畢!共用"+workTime/1000+"秒");
}
else
{
System.out.println("沒有任務休息一秒!");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
用列舉定義了一個不同型別的使用者:
public enum ComstorStyle {
COMMON,RAPID,VIP;
public String toString()
{
String name=null;
switch(this)
{
case COMMON:
name ="普通";
break;
case RAPID:
name="快速";
break;
case VIP:
name=name();
break;
}
return name;
}
}
專門用於定義常量的類:
public class TimeConstant {
public static final long TIME_MAX=10000;
public static final long TIME_MIN=1000;
public static final long TIME=1;
}
測試類:
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
public class BankTest {
public static void main(String[] args) {
//產生四個普通視窗
for(int i=1;i<5;i++)
{
Servicewindow commonwindow=new Servicewindow();
commonwindow.setNumber(i);
commonwindow.start();
}
//產生一個快速視窗
Servicewindow rapidwindow=new Servicewindow();
rapidwindow.setType(ComstorStyle.RAPID);
rapidwindow.start();
//產生一個VIP視窗
Servicewindow vipwindow=new Servicewindow();
vipwindow.setType(ComstorStyle.VIP);
vipwindow.start();
//模擬普通使用者取票
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
new Runnable(){
@Override
public void run() {
// TODO Auto-generatedmethod stub
Integer number=NumberMechine.getInstance().getCommonNumber().produceNumber();
//System.out.println(number+"8888888888888888888888888888");
System.out.println("第"+number+"普通使用者已拿到號,正等待服務!!");
}
},
0,
TimeConstant.TIME,
TimeUnit.SECONDS);
//模擬VIP使用者取票
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
new Runnable(){
@Override
public void run() {
// TODO Auto-generatedmethod stub
Integer number=NumberMechine.getInstance().getVipNumber().produceNumber();
System.out.println("第"+number+"VIP使用者已拿到號,正等待服務!!");
}
},
0,
TimeConstant.TIME*6,
TimeUnit.SECONDS);
//模擬快速視窗取票
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
new Runnable(){
@Override
public void run() {
// TODO Auto-generatedmethod stub
Integer number=NumberMechine.getInstance().getRapidNumber().produceNumber();
System.out.println("第"+number+"快速使用者已拿到號,正等待服務!!");
}
},
0,
TimeConstant.TIME*3,
TimeUnit.SECONDS);
}
}
執行結果:
總結:通過銀行排程系統,學會的分析事物,比如說有不同的使用者,但是隻有一個取號的機子,所以想到了單例模式來確保只有一個取號機,因為要有三個不同的使用者,所以這個取號機要管理這三個不同的使用者物件,因為使用者是規定好的,所以想到了用列舉。對於視窗叫號,它得向管理號的機子要。這就學到了一個重要的思想,隨擁有資料,把方法就定義在誰身上。所以要向出號機要。
------- android培訓、java培訓、期待與您交流! ----------