我有一个问题可能是它在列表的并发修改中引起的,我想知道在这种情况下究竟发生了什么:
List<Node> childrenUnmodifiable = shipCanvas.getChildrenUnmodifiable();
for (Node node : childrenUnmodifiable) {
...
shipCanvas
的类型为javafx.scene.layout.Pane
。
在上面的例子中,我可能会在for循环的行上得到java.util.NoSuchElementException
。我的假设是否正确,因为在创建childrenUnmodifiable
列表时,列表被更改了?
当我采用防御性复制策略时:
List<Node> childrenUnmodifiable = new ArrayList<>(shipCanvas.getChildren());
for (Node node : childrenUnmodifiable) {
...
创建java.util.ConcurrentModificationException
时我得到childrenUnmodifiable
。
有什么选择可以避免这种行为?从列表中检索实际上不再存在的元素是可以接受的。
我可以看到两个选项:
shipCanvas
。我对这两个选项都不满意,尤其是第二个选项,因为单个线程必须是UI线程。那么我还缺少其他选择吗?