📄 business.java
字号:
/*
* 创建日期 2005-2-26
*
* TODO 要更改此生成的文件的模板,请转至 窗口 - 首选项 - 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个数服务代理
protected Label[] labelAgent = new Label[Simulator.NUM_AGENTS];
//每个服务代理都有一个标签
protected Label labelQueue = new Label("Customers waiting: 0");
//用标签说明有多少个顾客在等待
protected Label labelServed = new Label("Customers servers: 0");
//用标签说明已服务了多少个顾客
protected Label labelWait = new Label("Average wait: 0");
//用标签说明平均有多少个顾客在等待
protected int numAgents = Simulator.NUM_INITIAL_AGENTS;
protected int numCustomer = 0; //该business的实际顾客数,开始时为0
/**
*
* @uml.property name="totalWait"
*/
protected long totalWait = 0L; //总的等待时间,用于计算平均等待时间
private Thread thread = null; //创建线程对象
private boolean doorIsOpen = false;
public Business(String title) //构造方法
{
super();
setup(title); //调用setup方法进行初始化
}
//下面三个方法是有待实现的抽象方法
public abstract void generateCustomer(); //产生一个顾客
public abstract Customer requestCustomerFor(int ID); //接待一个顾客
public abstract void updateDisplay(); //显示当前的服务状态
/**
*
* @uml.property name="totalWait"
*/
public void checkoutCustomer(long waitTime) { //处理某个顾客付款
numCustomer++; // 顾客数目增加1
totalWait += waitTime; //累计等待的时间
}
public void addAgent() {
if (numAgents < Simulator.NUM_AGENTS) //如果代理数没有超过总数
//则增加一个服务代理对象
{
agent[numAgents] = new Agent(this, numAgents);
agent[numAgents].start(); //启动这个线程对象
numAgents++; //代理数目增加1
}
}
public void retireAgent() //撤出一个代理
{
if (numAgents > 1) {
agent[numAgents - 1].halt();
numAgents--; //代理数目减少1
}
}
public void start() //启动各个服务代理开始服务
{
if (thread == null) {
thread = new Thread(this);
doorIsOpen = true;
thread.start();
for (int i = 0; i < numAgents; i++)
agent[i].start();
}
}
public void stop() //中止各个服务代理的服务
{
doorIsOpen = false;
thread = null;
for (int i = 0; i < numAgents; i++)
agent[i].halt();
}
public void openDoor() //开始营业;
{
doorIsOpen = true;
}
public void closeDoor() //停止营业;
{
doorIsOpen = false;
}
public void run() //线程的主体
{
while (thread == Thread.currentThread()) {
try //在最大的无顾客到来的时间内(随机时间)
{
thread
.sleep((int) (Math.random() * Simulator.MAX_NO_CUSTOMERS));
if (doorIsOpen) //如果在营业则产生一个顾客
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]); //每个格子放置一个服务代理标签
agent[i] = new Agent(this, i); //给代理数组元素分配一个代理对象
}
for (int i = numAgents; i < Simulator.NUM_AGENTS; i++)
labelAgent[i].setText("Agent " + i + ": inactive");
//自numAgents之后的数组元素,都没有分配代理对象
agentPanel.add(labelQueue); //把顾客等待队列的标签加到面板中
agentPanel.add(labelServed); //把服务等待队列标签加到面板中
agentPanel.add(labelWait); //把平均等待时间的标签加到面板中
setLayout(new BorderLayout());
add("Center", agentPanel); //把面板放在布局的下方
add("North", new Label(title)); //把标题放在布局的下方
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -