?? business.java
字號:
/*
* 創(chuàng)建日期 2005-2-26
*
* TODO 要更改此生成的文件的模板,請轉(zhuǎn)至 窗口 - 首選項 - Java - 代碼樣式 - 代碼模板
*/
package simulator;
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.Label;
import java.awt.Panel;
import javax.swing.JPanel;
public abstract class Business extends JPanel implements Runnable {
/**
*
* @uml.property name="agent"
* @uml.associationEnd multiplicity="(0 -1)" inverse="business:simulator.Agent"
*/
protected Agent[] agent = new Agent[Simulator.NUM_AGENTS];
// 建立NUM_AGENTS個數(shù)服務(wù)代理
protected Label[] labelAgent = new Label[Simulator.NUM_AGENTS];
//每個服務(wù)代理都有一個標(biāo)簽
protected Label labelQueue = new Label("Customers waiting: 0");
//用標(biāo)簽說明有多少個顧客在等待
protected Label labelServed = new Label("Customers servers: 0");
//用標(biāo)簽說明已服務(wù)了多少個顧客
protected Label labelWait = new Label("Average wait: 0");
//用標(biāo)簽說明平均有多少個顧客在等待
protected int numAgents = Simulator.NUM_INITIAL_AGENTS;
protected int numCustomer = 0; //該business的實際顧客數(shù),開始時為0
/**
*
* @uml.property name="totalWait"
*/
protected long totalWait = 0L; //總的等待時間,用于計算平均等待時間
private Thread thread = null; //創(chuàng)建線程對象
private boolean doorIsOpen = false;
public Business(String title) //構(gòu)造方法
{
super();
setup(title); //調(diào)用setup方法進(jìn)行初始化
}
//下面三個方法是有待實現(xiàn)的抽象方法
public abstract void generateCustomer(); //產(chǎn)生一個顧客
public abstract Customer requestCustomerFor(int ID); //接待一個顧客
public abstract void updateDisplay(); //顯示當(dāng)前的服務(wù)狀態(tài)
/**
*
* @uml.property name="totalWait"
*/
public void checkoutCustomer(long waitTime) { //處理某個顧客付款
numCustomer++; // 顧客數(shù)目增加1
totalWait += waitTime; //累計等待的時間
}
public void addAgent() {
if (numAgents < Simulator.NUM_AGENTS) //如果代理數(shù)沒有超過總數(shù)
//則增加一個服務(wù)代理對象
{
agent[numAgents] = new Agent(this, numAgents);
agent[numAgents].start(); //啟動這個線程對象
numAgents++; //代理數(shù)目增加1
}
}
public void retireAgent() //撤出一個代理
{
if (numAgents > 1) {
agent[numAgents - 1].halt();
numAgents--; //代理數(shù)目減少1
}
}
public void start() //啟動各個服務(wù)代理開始服務(wù)
{
if (thread == null) {
thread = new Thread(this);
doorIsOpen = true;
thread.start();
for (int i = 0; i < numAgents; i++)
agent[i].start();
}
}
public void stop() //中止各個服務(wù)代理的服務(wù)
{
doorIsOpen = false;
thread = null;
for (int i = 0; i < numAgents; i++)
agent[i].halt();
}
public void openDoor() //開始營業(yè);
{
doorIsOpen = true;
}
public void closeDoor() //停止?fàn)I業(yè);
{
doorIsOpen = false;
}
public void run() //線程的主體
{
while (thread == Thread.currentThread()) {
try //在最大的無顧客到來的時間內(nèi)(隨機(jī)時間)
{
thread
.sleep((int) (Math.random() * Simulator.MAX_NO_CUSTOMERS));
if (doorIsOpen) //如果在營業(yè)則產(chǎn)生一個顧客
generateCustomer();
updateDisplay(); //更新后,重新顯示
} catch (InterruptedException ie) {
System.out.println("Business exception: " + ie);
}
}
}
private void setup(String title) { //初始化工作
Panel agentPanel = new Panel(); //建立一個面板
agentPanel.setLayout(new GridLayout(Simulator.NUM_AGENTS + 3, 1));
//布局為GridLayout
for (int i = 0; i < Simulator.NUM_AGENTS; i++) {
labelAgent[i] = new Label("Agent " + i + ": served 0");
agentPanel.add(labelAgent[i]); //每個格子放置一個服務(wù)代理標(biāo)簽
agent[i] = new Agent(this, i); //給代理數(shù)組元素分配一個代理對象
}
for (int i = numAgents; i < Simulator.NUM_AGENTS; i++)
labelAgent[i].setText("Agent " + i + ": inactive");
//自numAgents之后的數(shù)組元素,都沒有分配代理對象
agentPanel.add(labelQueue); //把顧客等待隊列的標(biāo)簽加到面板中
agentPanel.add(labelServed); //把服務(wù)等待隊列標(biāo)簽加到面板中
agentPanel.add(labelWait); //把平均等待時間的標(biāo)簽加到面板中
setLayout(new BorderLayout());
add("Center", agentPanel); //把面板放在布局的下方
add("North", new Label(title)); //把標(biāo)題放在布局的下方
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -