java - AsyncEventHandler - 实时系统 Java

标签 java multithreading asynchronous real-time

我正在尝试制作一个模拟程序,其中:

  • jar 头被传送到传送带上
  • jar 已满
  • jar 头已检查
  • 如果 jar 头损坏,则会将其从传送带上移走

错误:

Exception in thread "RealtimeThread[pri=20,aperiodic]" 
java.lang.NullPointerException
at assignment$Sensor.run(assignment.java:99)
at javax.realtime.RealtimeThread$Logic.run(RealtimeThread.java:244)
at javax.realtime.MemoryArea.enter(MemoryArea.java)
at javax.realtime.MemoryArea.enterInternal(MemoryArea.java:1472)
at javax.realtime.RealtimeThread$Logic.run(RealtimeThread.java:230)

如果 jar 头损坏,我想使用 AsyncEventHandler 触发代码,但如果第一次尝试时发现 jar 头损坏,它会给出 NullPointerException 错误,但如果 jar 头在第一次循环中未损坏,则代码可以正常工作。

import java.util.Random;
import javax.realtime.*;

public class realtime{

    AsyncEvent damage;

    public static void main(String[] args) {

        realtime a = new realtime();
    }

    public realtime() {

        Can can = new Can(1);

        Conveyer conveyer = new Conveyer(can);
        Sensor Sensor = new Sensor(can);
        Grabber grabber = new Grabber(can, Sensor);

        ReleaseParameters relConveyer = new PeriodicParameters(new RelativeTime(1000,0));
        ReleaseParameters relSensor = new PeriodicParameters(new RelativeTime(1000,0));

        conveyer.setReleaseParameters(relConveyer);
        Sensor.setReleaseParameters(relSensor);

        conveyer.start();
        Sensor.start();

        damage = new AsyncEvent();
        damage.setHandler(grabber);

    }

    class Can {

        int id;
        boolean filled;
        boolean damaged;

        public Can(int id) {
            this.id = id;
        }

        public void isFilled(boolean status) {
            this.filled = status;                   //Print if the Can is filled
        }

        public void isDamaged(boolean status) {
            this.damaged = status;          
        }

    }

    class Conveyer extends RealtimeThread {

        Can can;

        Random random = new Random();

        public Conveyer(Can can) {
            this.can = can;
        }

        @Override
        public void run() {                         //While loop can be used to repeat

            while(true) {
                System.out.println("Can " + can.id + " has entered the conveyer");
                System.out.println("Can " + can.id + " is being filled");
                can.isFilled(true);                     //Sleep to give time to fill
                System.out.println("Can " + can.id + " is filled");
                System.out.println("Can " + can.id + " is being scanned");
                can.isDamaged(random.nextBoolean());
                try {
                    waitForNextRelease();
                }
                catch (Exception e) {}
            }

        }

    }

    class Sensor extends RealtimeThread{

        Can can;

        public Sensor(Can can) {
            this.can = can;
        }

        @Override
        public void run() {                         //While loop can be used to repeat

            while(true) {
                if(can.damaged) {
                    System.out.println("Can " + can.id + " is Damaged!");
                    damage.fire();
                } else {
                    System.out.println("Can " + can.id + " is moved to Stage 2");
                }
                try {
                    waitForNextRelease();
                }
                catch (Exception e) {}
            }

        }

    }

    class Grabber extends AsyncEventHandler {

        Can can;
        RealtimeThread rtt;
        boolean damaged = false;

        public Grabber(Can can, RealtimeThread rtt) {
            this.can = can;
            this.rtt = rtt;
        }

        public void handleAsyncEvent() {

            System.out.println("Can " + can.id + " is disposed");

        }

    }

}

最佳答案

您的 Can 类没有默认构造函数。因此,在您的 Conveyor 类中,您有 Can can; 这可能会给您带来 NullPointerException。只需向 Can 类添加另一个构造函数,如下所示:

public Can() {};

关于java - AsyncEventHandler - 实时系统 Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56417165/

相关文章:

c++ - 我应该按什么顺序发送 callback() 并通知服务员?

.net - 如何编写生产者-消费者问题解决方案的测试?

.net - 异步套接字 - 处理错误的 socket.AcceptAsync 值

objective-c - 如果我有一个使用 Obj-C block 的 for 循环,我如何识别最后一次迭代?

java - Spring Batch 是否具有跟踪已处理行的功能?

java - 我无法在 ASM JAVA 中加载 invokedynamic 的局部变量

java - 什么时候抛出 "java.io.IOException:Connection reset by peer"?

java - 自 facebook SDK 以来,转换为 Dalvik 格式失败并出现错误 1

Java 锁类型,如果另一个线程正在执行则取消执行

c# - Windows Phone 7 异步添加项目到堆栈面板