我正在编写一个简单的僵尸生成插件。产卵由另一个线程完成。当我运行插件时,在播放一段时间后出现以下错误:
[Server thread/ERROR]: Encountered an unexpected exception
java.util.ConcurrentModificationException
at java.util.HashMap$HashIterator.nextEntry(Unknown Source) ~[?:1.7.0_25]
at java.util.HashMap$KeyIterator.next(Unknown Source) ~[?:1.7.0_25]
at net.minecraft.server.v1_7_R1.EntityTracker.updatePlayers(EntityTracker.java:152) ~[craftbukkit.jar:git-Bukkit-1.7.2-R0.3-b3020jnks]
at net.minecraft.server.v1_7_R1.MinecraftServer.u(MinecraftServer.java:646) ~[craftbukkit.jar:git-Bukkit-1.7.2-R0.3-b3020jnks]
at net.minecraft.server.v1_7_R1.DedicatedServer.u(DedicatedServer.java:250) ~[craftbukkit.jar:git-Bukkit-1.7.2-R0.3-b3020jnks]
at net.minecraft.server.v1_7_R1.MinecraftServer.t(MinecraftServer.java:545) ~[craftbukkit.jar:git-Bukkit-1.7.2-R0.3-b3020jnks]
at net.minecraft.server.v1_7_R1.MinecraftServer.run(MinecraftServer.java:457) [craftbukkit.jar:git-Bukkit-1.7.2-R0.3-b3020jnks]
at net.minecraft.server.v1_7_R1.ThreadServerApplication.run(SourceFile:617) [craftbukkit.jar:git-Bukkit-1.7.2-R0.3-b3020jnks]
此错误继续发生,但很少发生,似乎是随机的。我对这个问题的想法是,产生线程是EntynTracker的异步,导致异常,因为我的线程修改了实体列表,而bukkit的另一部分试图告诉玩家怪物的位置。
我不知道确切的错误源是什么,但我想我必须将我的线程与bukkit的某些部分同步。有人有解决方案吗? (有没有办法设置一个僵尸会掉落的物品?整个腐烂的肉体开始给我做噩梦)。
提前致谢。
答案 0 :(得分:1)
您的stacktrace表示您正在尝试从另一个线程修改您的集合。 您可以尝试同步方法或使用类似ConcurrentHashMap的内容。
如果你真的不需要修改到另一个线程,你也可以使用Bukkit的日程安排来完成这项工作:
private final Map<T> map = new HashMap<T>();
// ... stuff happens
final T value;
// work with your value
server.getScheduler().scheduleSyncDelayedTask(plugin, new Runnable() {
public void run() {
map.add(value);
}
}, 0L);
// runs the run() method after 0 ticks on the main thread