Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaFx,多线程应用程序,奇怪的异常_Java_Multithreading_User Interface_Javafx 2_Javafx - Fatal编程技术网

JavaFx,多线程应用程序,奇怪的异常

JavaFx,多线程应用程序,奇怪的异常,java,multithreading,user-interface,javafx-2,javafx,Java,Multithreading,User Interface,Javafx 2,Javafx,我正在开发一个JavaFx应用程序。应用程序创建多个线程(同一类)。 线程在此处创建: for (i = 0; i < turtlesNumber; i++) { TurtleRunThread turtleRunThread = new TurtleRunThread(); turtleRunThread.setController(this.controller); turtleRunThread.setTurtle(this.mode

我正在开发一个JavaFx应用程序。应用程序创建多个线程(同一类)。 线程在此处创建:

for (i = 0; i < turtlesNumber; i++) {
        TurtleRunThread turtleRunThread = new TurtleRunThread();

        turtleRunThread.setController(this.controller);
        turtleRunThread.setTurtle(this.model.getTurtles().get(i));
        turtleRunThread.setFinish(this.mainUI.getRacePane().getWidth() - 47.3);

        turtleRunThread.start();

        threadArrayList.add(turtleRunThread);
    }

你有什么想法吗?

包裹
控制器。修改翻领位置(翻领、速度、步幅)
进入
平台。runLater()


所有UI操作都必须在UI线程上完成。

wrap
controller。修改TurtlePosition(turtle、speed、step)
进入
平台。runLater()

所有UI操作都必须在UI线程上完成

     public void run() {
    //this.controller.run(this.turtle, this.finish);

    long speed = 500;
    double step = 20; //10 pixeli

    while (turtle.getX() < finish) {
        Random random = new Random();

        controller.modifyTurtlePosition(turtle, speed, step);

        if (Math.random() < 0.2) {
            if (Math.random() < 0.5) {
                if (speed > 100)
                    speed -= random.nextLong() % (((double)1 / 3) * speed);
            } else {
                if (speed < 1500)
                    speed += random.nextLong() % (((double)1 / 3) * speed);
            }
        }
    }
}
    public void modifyTurtlePosition(final ImageView turtle, long speed, double step) {
    Timeline timeline = new Timeline();

    final double newX = turtle.getX() + step;

    KeyValue keyValue = new KeyValue(turtle.xProperty(), turtle.getX() + step);
    KeyFrame keyFrame = new KeyFrame(Duration.millis(speed), keyValue);

    timeline.getKeyFrames().add(keyFrame);

    timeline.setOnFinished(new EventHandler<ActionEvent>() {
        @Override
        public void handle(ActionEvent actionEvent) {
            turtle.setX(newX);
        }
    });

    timeline.play();

    try {
        Thread.sleep(speed);
    } catch (InterruptedException e) {
        System.err.println(e.getMessage());
    }
}
Exception in thread "Thread-16" java.lang.ArrayIndexOutOfBoundsException: 2
at java.util.ArrayList.add(ArrayList.java:412)
at com.sun.scenario.animation.AbstractMasterTimer.addPulseReceiver(AbstractMasterTimer.java:211)
at com.sun.scenario.animation.shared.AnimationPulseReceiver.addPulseReceiver(AnimationPulseReceiver.java:70)
at com.sun.scenario.animation.shared.AnimationPulseReceiver.start(AnimationPulseReceiver.java:84)
at javafx.animation.Animation.play(Animation.java:775)
at javafx.animation.Animation.play(Animation.java:762)
at sample.Controller.modifyTurtlePosition(Controller.java:95)
at sample.TurtleRunThread.run(TurtleRunThread.java:35)
    java.lang.NullPointerException
at     com.sun.scenario.animation.AbstractMasterTimer.timePulseImpl(AbstractMasterTimer.java:366)
at com.sun.scenario.animation.AbstractMasterTimer$MainLoop.run(AbstractMasterTimer.java:289)
at com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:456)
at com.sun.javafx.tk.quantum.QuantumToolkit$9.run(QuantumToolkit.java:329)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.access$100(WinApplication.java:29)
at com.sun.glass.ui.win.WinApplication$3$1.run(WinApplication.java:73)
at java.lang.Thread.run(Thread.java:722)
Platform.runLater(new Runnable() {
    public void run() {
        controller.modifyTurtlePosition(turtle, speed, step);
    }
}