java - 如何处理 ConcurrentModificationException

标签 java for-loop runnable concurrentmodification

我从我的冷却计时器中得到一个 ConcurrentModificationException。我使用线程每秒减少值,如下所示:

public class CoolDownTimer implements Runnable {
    @Override
    public void run() {
        for (String s : playerCooldowns.keySet()) {
            playerCooldowns.put(s, playerCooldowns.get(s) - 20);
            if (playerCooldowns.get(s) <= 0) {
                playerCooldowns.remove(s);
            }
        }
    }

}

所以每一秒它应该将每个玩家的冷却时间减少 20,但问题是我在运行程序时每隔几个小时就会得到一次 CME,尤其是当很多人在线时。我该如何做到这一点,如果它仍在修改列表,它将等到当前操作完成并创建一种修改队列?谢谢!这是堆栈跟踪:

2012-06-18 20:59:05 [WARNING] Task of 'SurvivorsClasses' generated an exception
java.util.ConcurrentModificationException
at java.util.HashMap$HashIterator.nextEntry(HashMap.java:839)
at java.util.HashMap$KeyIterator.next(HashMap.java:874)
at me.zachoooo.survivorclasses.CoolDownManager$CoolDownTimer.run(CoolDownManager.java:13)
at org.bukkit.craftbukkit.scheduler.CraftScheduler.mainThreadHeartbeat(CraftScheduler.java:126)
at net.minecraft.server.MinecraftServer.w(MinecraftServer.java:533)
at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:459)

第 13 行是 for 循环的开始...

最佳答案

使用 foreach 循环时不能修改集合。

可以但是遍历 Map.entrySet() 并执行您需要的一切:

public void run() {
    for (Iterator<Map.Entry<String,Integer>> i = playerCooldowns.entrySet().iterator(); i.hasNext();) {
        Map.Entry<String,Integer> entry = i.next();
        entry.setValue(entry.getValue() - 20); // update via the Map.Entry
        if (entry.getValue() <= 0) {
            i.remove(); // remove via the iterator
        }
    }
}

关于java - 如何处理 ConcurrentModificationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11094268/

相关文章:

java - 如何随机播放(Arraylist)而不显示重复项

c# - 不变断言适合 C# 编程吗?

java - 使用最小 for 循环创建数字模式

javascript - 脱离 for 循环

C++:for 循环中的多个退出条件(多个变量):AND -ed 还是 OR -ed?

java - 如何将图像打包到 Runnable JAR 中

java - 使用 spring boot 在同一端口上使用多个 webapp

java - 如何在netbeans平台应用程序的菜单栏中添加myAppHelp.pdf文件?

java - 可运行参数

java - 是否可以在线程可运行的声明中将文件写入交互式 shell?