2016-07-06 45 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個不同的線程試圖同時修改同一個列表時,可能會發生這種情況,但更多的時候這意味着您在嘗試修改列表的同時迭代它(這是不允許的)。