java.util.ConcurrentModificationException 在 javafx 时间轴中
java.util.ConcurrentModificationException in javafx timeline
我还没有自己制作线程。
我有一个从程序开始到结束的时间轴,如下所示:
Timeline timeline = new Timeline(
new KeyFrame(Duration.millis(TIMELINE_DELAY), event -> {
intrudersList.forEach(Intruder::action);
towersList.forEach(Tower::action);
otherActivesList.forEach(Active::action);
}));
timeline.setCycleCount(Timeline.INDEFINITE);
timeline.play();
并且当 Intruder class 的 die 方法被调用时,我得到这个并发修改异常。
首先,我其实不明白时间线是如何运作的!它会自己创建新线程还是什么?如果我们有一个时间线,每 10 秒执行一次任务,而该任务需要 15 秒才能完成,将会发生什么情况!
第二个确实是:我怎样才能解决这个问题!?
public void die() {
this.getCell().getContent().remove(this);
TimeLine.getInstance().removeIntruder(this);
System.out.println("death of intruder at: " + cell);
}
查看 docs。当不允许修改列表时,通常会发生此异常。
当 2 个不同的线程试图同时修改同一个列表时,可能会发生这种情况,但更常见的情况是,这意味着您在迭代列表时试图修改它(这是不允许的)。
非常感谢@DVarga,
这就是问题所在以及我如何解决它:
问题是我正在修改 removeIntruder
中的 intrudersList
,同时在 KeyFrame
中对其进行迭代。
我通过将 removeIntruder
方法的主体包装在 Platform.runLater(() -> { ... })
块中来解决它。
我猜 Platform.runLater 做的是它等到列表可修改然后修改它。
我还没有自己制作线程。 我有一个从程序开始到结束的时间轴,如下所示:
Timeline timeline = new Timeline(
new KeyFrame(Duration.millis(TIMELINE_DELAY), event -> {
intrudersList.forEach(Intruder::action);
towersList.forEach(Tower::action);
otherActivesList.forEach(Active::action);
}));
timeline.setCycleCount(Timeline.INDEFINITE);
timeline.play();
并且当 Intruder class 的 die 方法被调用时,我得到这个并发修改异常。
首先,我其实不明白时间线是如何运作的!它会自己创建新线程还是什么?如果我们有一个时间线,每 10 秒执行一次任务,而该任务需要 15 秒才能完成,将会发生什么情况! 第二个确实是:我怎样才能解决这个问题!?
public void die() {
this.getCell().getContent().remove(this);
TimeLine.getInstance().removeIntruder(this);
System.out.println("death of intruder at: " + cell);
}
查看 docs。当不允许修改列表时,通常会发生此异常。
当 2 个不同的线程试图同时修改同一个列表时,可能会发生这种情况,但更常见的情况是,这意味着您在迭代列表时试图修改它(这是不允许的)。
非常感谢@DVarga,
这就是问题所在以及我如何解决它:
问题是我正在修改 removeIntruder
中的 intrudersList
,同时在 KeyFrame
中对其进行迭代。
我通过将 removeIntruder
方法的主体包装在 Platform.runLater(() -> { ... })
块中来解决它。
我猜 Platform.runLater 做的是它等到列表可修改然后修改它。