当前位置: 首页 > 知识库问答 >
问题:

Minecraft bukkit僵尸生成错误

索令
2023-03-14

我正在编写一个简单的僵尸生成插件。产卵由另一个线程完成。当我运行该插件时,我在玩了一段时间后收到以下错误:

[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]

这种错误继续发生,但很少发生,而且似乎是随机的。我对这个问题的想法是,生成线程与EntityTracker异步,这导致了一个异常,因为我的线程修改了实体列表,而bukkit的另一部分试图告诉玩家怪物的位置
我不知道确切的错误源是什么,但我想我必须将我的线程与bukkit的某个部分同步。有人对此有解决方案吗?(有没有办法设定僵尸会掉落的物品?整个腐烂的肉开始让我做噩梦)。

提前谢谢。

共有1个答案

越学博
2023-03-14

您的堆栈跟踪表明您正在尝试从另一个线程修改您的集合。您可以尝试同步您的方法或使用类似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
 类似资料:
  • 僵尸进程 当一个进程完成它的工作终止之后,它的父进程需要调用wait()或者waitpid()系统调用取得子进程的终止状态。 一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵尸进程。 理解了孤儿进程和僵尸进程,我们临时加了守护进程这一小节,守护进程就是后台进程吗?没那么简单。

  • 僵尸增量是一款放置游戏,你需要控制一群僵尸破坏小镇...

  • 问题内容: 我在Go中有一个应用程序,它可以重新路由二进制文件的STDIN和STDOUT,然后运行它们。简而言之,我正在做: 我注意到,只要在运行命令A时退出命令B的进程,它就会在进程表中变成僵尸进程。 这是一个例子: 如果commandB仍在运行时退出,为什么commandB会变成僵尸?我在Ubuntu 14上运行Go 1.5。 问题答案: 当某个进程退出时,无论正在运行什么其他进程,它 总是

  • 该款植物大战僵尸是一款基于pygame的射击版防守游戏。简单易玩,很容易上手,一般射击类游戏,都可以采用该款游戏的框架。 游戏界面如下: 游戏人物介绍:              荷兰豆  玩家的代表,作用发射寒冰弹。用于阻止僵尸越过边界,攻入城堡             辐射丧尸  一种快速移动的丧尸,能够大量集结,快速突破玩家的防守      病毒丧尸 一种慢速移动的丧尸,但作为辐射丧尸的旁系

  • 我正在和一个队友讨论锁定.NET的问题。他是一个非常聪明的人,在低级和高级编程方面都有广泛的背景,但他在低级编程方面的经验远远超过我。无论如何,他认为,如果可能的话,应该避免在预期处于重载下的关键系统上进行.NET锁定,以避免“僵尸线程”使系统崩溃的可能性很小。我经常使用锁定,我不知道什么是“僵尸线程”,所以我问。我从他的解释中得到的印象是,僵尸线程是一个已经终止但不知怎么还保留着一些资源的线程。

  • 问题内容: 我在前台启动了我的程序(守护程序),然后用杀死了它,但剩下一个僵尸,无法用杀死它。如何杀死僵尸进程? 如果僵尸是一个死进程(已被杀死),我如何将其从输出中删除? 问题答案: 僵尸已经死了,所以您无法杀死它。要清理僵尸,必须等待其父级等待,因此杀死父级应该可以消除僵尸。(父对象死后,僵尸将被pid 1继承,而pid 1将等待该僵尸并清除其在进程表中的条目。)如果守护程序正在生成成为僵尸的