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 做的是它等到列表可修改然后修改它。