1

私の MUDRPG 用の Java プログラムには、現時点で 2 つのスレッドがあります (私の間違いでなければ、私はエンジンを作成していません)。1 つのスレッドは純粋にグラフィカルで、すべてのGuiオブジェクトを表示し、別のスレッドはすべての計算を処理します。その 2 番目のスレッドは、戦闘を処理するスレッドです。私のバトル コードでは、hitsplat GUI が存在するかどうかを確認していますが、関数の呼び出しが数回成功した後 (毎回異なる番号) ConcurrentModificationException、. これは、この戦闘がヒットプラットが存在するかどうかを確認しようとしているのと同時に、グラフィックス スレッドがLinkedHashMap. この問題を回避するために a から読み取る適切な方法を教えてください。または、代わりにLinkedHashMapa を使用する必要がありますか? ConcurrentHashMap私の理解では、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) {
        }
    }
4

1 に答える 1