Java 队列定时器

标签 java oop timer queue

我的任务是模拟超市中的队列如何演变,并且每当客户进入或存在商店时,我必须使用计时器进行输出。在超市里,我有 3 个队列来处理顾客。在每个客户端,他们应该在我的 GUI 中输出到达时间和离开时间。我可以为每个队列使用相同的计时器吗? (它们不应同时或在同一时间段开始输出)。我尝试将计时器作为事件类中的参数传递,但出现空指针异常。请帮忙。

  public void simulationPrep (Queue q,JPanel p,int time,Timer t, int selection)

  {

    TimeClass tc;
    int queueCapacity=0;
    float queueProcTime=0;
    float tempSTMin, float tempSTMax;
    tempSTMin=getServiceTimeMin();
    tempSTMax=getServiceTimeMax();
    queueCapacity = 10 + (int)( Math.random()*20);
    queueProcTime = tempSTMin + (float)(Math.random()*tempSTMax);
    q1.setCapacity(queueCapacity);
    q1.setProcessingTime(queueProcTime);
    tc = new TimeClass((int)(queueProcTime/queueCapacity),p,selection);
    t = new Timer(time, tc);
    t.start();
}
public void simulate()
{
    if(getSelection()>=1)
    {
        simulationPrep(q1,p21,1000,timer1,1);
        if(getSelection()>=2)
        {
            simulationPrep(q2,p22,1500,timer2,2);
            if(getSelection()==3)
            {
                simulationPrep(q3,p23,1700,timer3,3);
            }
        }
    }

}

public class TimeClass implements ActionListener
{
    int counter;
    JPanel p;
    int selection;
    public TimeClass(int counter,JPanel p,int selection)
    {
        this.counter = counter;
        this.p = p;
        this.selection = selection;
    }
    public void actionPerformed(ActionEvent e)
    {
        counter--;
        if(counter>=1)
        {
            p.add(new JLabel("Hi "+counter));
            p.updateUI();
        }
        if(counter<1)
        {
            p.add(new JLabel("Done"));
            p.updateUI();
            timer1.stop();
            timer2.stop();
            timer3.stop();
        }
    }
}

如果有人不理解代码,请询问,我会更具体,但这是我在这里发表的第一篇文章,我对 Java 有点陌生。

这是我在输出窗口中得到的内容:

    Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at simulation.Simulation$TimeClass.actionPerformed(Simulation.java:229)
at javax.swing.Timer.fireActionPerformed(Unknown Source)
at javax.swing.Timer$DoPostEvent.run(Unknown Source)
at java.awt.event.InvocationEvent.dispatch(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$000(Unknown Source)
at java.awt.EventQueue$1.run(Unknown Source)
at java.awt.EventQueue$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
    Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at simulation.Simulation$TimeClass.actionPerformed(Simulation.java:229)
at javax.swing.Timer.fireActionPerformed(Unknown Source)
at javax.swing.Timer$DoPostEvent.run(Unknown Source)
at java.awt.event.InvocationEvent.dispatch(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$000(Unknown Source)
at java.awt.EventQueue$1.run(Unknown Source)
at java.awt.EventQueue$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

最佳答案

Simulation.java 文件的第 229 行导致 NullPointerException。具体来说,它位于 TimeClass 内部类的 actionPerformed(...) 方法中。

转到那一行,你就会遇到问题。

我怀疑它是以下三行之一:

        timer1.stop();
        timer2.stop();
        timer3.stop();

这些计时器变量之一可能为空。

快速修复(尽管可能无法解决真正的问题)是这样的:

if (timer1 != null) {
    timer1.stop();
}

其他两个计时器变量依此类推。

关于Java 队列定时器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9974888/

相关文章:

javascript - 计时器完成后如何在计时器上显示警报

java - 如何在Android测验中实现计时器?

java - 在Spring-WS中如何使用WebServiceMessageDrivenBean?

java - 将父类(super class)的对象转换为子类——向下转型

java - 以编程方式更改 TextView 对齐方式

c# - 我的文档类应该有打印方法还是应该有一个专用的打印机类?

Java 成员初始化模式

c - 微 Controller 计数器溢出和计数

java - Spring Boot 无法从资源文件夹加载 js 文件

java - 多次访问自定义对象的原子属性