gpt4 book ai didi

java - 在迭代列表时从列表中删除对象

转载 作者:行者123 更新时间:2023-12-02 11:13:26 24 4
gpt4 key购买 nike

我目前正在开发一个游戏,为了编辑/删除/添加我的所有实体,我有一个数组列表。每一帧(每秒 60 倍)列表中的所有内容都会更新并渲染。当我调用添加或删除对象时(在实体更新方法中),我在“Thread-2”中收到错误。经过一些快速研究,我发现在迭代列表时编辑列表是不正确的。这是我目前遇到的问题吗?或者是因为我的列表不是“线程安全”?

渲染方法:

public void render(Graphics g){
for(Entity entity: list){
entity.render(g);
}
}

更新方法:

public void update(){
for(Entity entity: list){
entity.update();
}
}

如果我的问题是我在更新列表时正在编辑列表,这将如何解决它?:

public void update(){
for(Entity entity: list){
entity.update();
}

for(Entity entity: removeList){
list.remove(entity);
}
removeList.clear();
}

最佳答案

or is it because my list isn't "thread safe"?

是的,如果 renderupdate 可以在不同线程上同时运行。

would this be how to fix it?

不,仍然是同样的问题,您将在迭代时尝试删除。

要么

  1. 仅包含要保留的条目构建一个新列表,然后将其交换为 list(更新对象引用是原子的),或者

  2. list 上同步 renderupdate 方法的相关部分。

这是 #1 的粗略示例:

public void update(){

List newList = new AppropriateListType(list);
for (Entity entity : removeList){
newList.remove(entity);
}
removeList.clear(); // Or removeList = new AppropriateListType();
list = newList;

for (Entity entity: list) {
entity.update();
}
}

(请注意,我颠倒了这两个循环的顺序;大概更新您要删除的实体没有什么意义。)

这是有效的,因为在我们修改新列表时,没有任何东西可以尝试迭代它,因为在我们执行 list = newList 之前,新列表对于 的特定执行是完全私有(private)的>更新方法。一旦我们执行list = newList,它就在对象上,因此其他代码将尝试使用它。

以及 #2 的粗略示例:

public void update(){
synchronized (list) {
for (Entity entity: removeList){
list.remove(entity);
}
}
removeList.clear();

for (Entity entity: list) {
// This is probably fine depending on how `render` and `update` work
// but you *may* need to `synchronize` on `entity` (here and in `render`
// depending on how `render` and `update` work
entity.update();
}
}

(再次反转循环。)

有关同步的更多信息,请参阅 the Java synchronization tutorial .

<小时/>

旁注:您可能还需要检查 removeList 的迭代和更新。

关于java - 在迭代列表时从列表中删除对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50450596/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com