2016-07-06 87 views
-1

我还没有自己创建线程。 我有一个从一开始就运行到程序,如下所示的末尾一个时间表:javafx时间轴中的java.util.ConcurrentModificationException

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(); 

而当入侵者类的模方法被调用时,我得到这个并发修改例外。

首先,我并没有真正理解时间轴是如何工作的!它创建新线程本身还是什么?以及如果我们有一个时间线每10秒执行一次任务并且该任务需要15秒完成,会发生什么情况! 第二的确如此:我如何得到这个修正!?

public void die() { 
    this.getCell().getContent().remove(this); 
    TimeLine.getInstance().removeIntruder(this); 
    System.out.println("death of intruder at: " + cell); 
} 
+1

只需将die的内容封装到Platform.runLater(() - > {...})块中即可。 – DVarga

+0

谢谢。那么,lambda什么时候会被调用?! –

+0

也许你正在尝试编辑列表,而你迭代它? Intruder :: action是做什么的? – NwDev

回答

0

非常感谢@DVarga, 这是什么问题了,我怎么固定它: 的问题是,我是修改removeIntruderintrudersList,而在KeyFrame上迭代。 我通过在Platform.runLater(() -> { ... })块中包装removeIntruder方法的主体来解决这个问题。 我猜猜看Platform.runLater所做的是等待列表可修改并修改它。

1

查看docs。这种异常通常发生在列表被修改但不允许的情况下。

当2个不同的线程试图同时修改同一个列表时,可能会发生这种情况,但更多的时候这意味着您在尝试修改列表的同时迭代它(这是不允许的)。