⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 business.java

📁 源程序可使用Jdk1.3以上的任何版本编译和运行主类是Simulator也可以在eclipse环境下直接编译和运行。 顾客队列服务模拟系统
💻 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 + -