0
我正在開發一個JavaFx應用程序。應用程序創建多個線程(相同的類)。 在這裏創建的線程:JavaFx,多線程應用程序,奇怪的異常
這是Thread類的run方法:
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);
}
}
}
}
而且這是在控制器方法 「modifyTurtlePositions(...)」:
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)
你有什麼想法嗎?