在我的 MUDRPG 的 Java 程序中,目前有两个线程(如果我没记错的话,我没有编写引擎)。一个线程是纯图形的并显示所有Gui
对象,另一个线程处理所有计算。第二个线程是处理战斗的线程。在我的战斗代码中,我正在检查是否存在 hitsplat gui,但是,在几次成功调用该函数后(每次都不同的数字),我遇到了ConcurrentModificationException
. 这似乎是因为在这场战斗试图检查 hitsplats 是否存在的同时,图形线程正试图从LinkedHashMap
. 有人可以告诉我从 a 中读取的正确方法LinkedHashMap
是避免这个问题,还是我需要使用 aConcurrentHashMap
来代替?我的理解是LinkedHashMap
使用它是因为它可以处理订单,我不太确定ConcurrentHashMap
.
在计算线程上访问 LinkedHashMap 的代码:
private boolean checkHitsplats(){
System.out.println("I get called)");
while (true) {
try {
if (OneQuest.getInstance().getTickThread().getGuis()
.get("HitsplatPlayer") == null
&& OneQuest.getInstance().getTickThread().getGuis()
.get("HitsplatMonster1") == null
&& OneQuest.getInstance().getTickThread().getGuis()
.get("HitsplatMonster2") == null
&& OneQuest.getInstance().getTickThread().getGuis()
.get("HitsplatMonster3") == null) {
return false; // return false if none exist
} else
return true; // return true of any hitsplats exist
} catch (ConcurrentModificationException e) {
System.out.println("modification error");
}
}
}
循环遍历linkedHashMap 以显示图形项的代码片段,其中guis
是添加了所有图形对象的LinkedHashMap。
private void tick() {
synchronized (guis) {
Iterator<Gui> iter = guis.values().iterator();
while (iter.hasNext()) {
Gui gui = iter.next();
if (gui.isShowing()) {
gui.render(window);
}
}
}
if (guiConsole.isShowing()) {
guiConsole.render(window);
}
}
编辑: 好心人建议的 checkHitsplats 版本 2。
private boolean checkHitsplats(){
Object[] guis = OneQuest.getInstance().getTickThread().getGuis().values().toArray();
System.out.println("I get called)");
while (true) {
try {
for (int i = 0; i < guis.length; i++) {
if (((Gui) guis[i]).getGuiName() == "HitsplatPlayer"
|| ((Gui) guis[i]).getGuiName() == "HitsplatMonster1"
|| ((Gui) guis[i]).getGuiName() == "HitsplatMonster2"
|| ((Gui) guis[i]).getGuiName() == "HitsplatMonster3")
return true;
}
return false;
} catch (Exception e) {
}
}