Bukkit/Spigot -如何等待直到BukkitRunnable完成



在我的主类中的onDisbale()方法中,我有一个创建并启动新BukkitRunnables的循环。我在控制台中得到一个错误:org.bukkit.plugin.IllegalPluginAccessException: Plugin attempted to register task while disabled
我需要以某种方式等待我的onDisable()方法,直到我在循环中创建的所有BukkitRunnables完成。怎么做呢?
我的代码是这样的:

@Override
public void onDisable() {
for (Player p : Bukkit.getOnlinePlayers()) {
new PlayerDataSaverRunnable().runTaskAsynchronously(this);
}
}

onDisable方法是在您的插件被禁用和服务器关闭之前被调用的最后一件事。因此,正如错误信息所说,不幸的是,您无法在onDisable函数中调度任何新任务。

您在评论中提到,您试图写入插件文件夹中的文件,在正常情况下,您希望异步执行该操作。但是,因为onDisable只有在服务器关闭时才会被调用(或者当整个服务器被/reload重新加载时),所以在这里运行阻塞主线程的代码是完全可以的,并且可能需要几秒钟才能运行-在关闭的情况下,当这个方法被调用时,所有的玩家都已经被踢出服务器,所以没有"延迟";抱怨。如果你的插件超级高级,并且必须保存一堆东西,我认为任何服务器所有者都不会抱怨,即使它需要10秒左右的时间来禁用。

当然,你必须保存一些疯狂的东西,因为它需要整整10秒钟来保存。更有可能的是,大多数文件将在几毫秒内保存。

如果你真的想尽快禁用插件,你可以考虑设置一些每5分钟运行一次的异步任务,并自动保存文件。然后,在onDisable中,您只能保存自上次运行自动保护程序以来更改的文件。无论如何,这是一个很好的实践,以防服务器崩溃或断电,而onDisable方法没有机会运行。但是,话又说回来,我仍然建议你保存所有在onDisable方法(这就是我为我所有的插件,以及),即使它会花几秒钟,阻塞主线程,只是为了让你可以100%肯定,一切都得到正确保存。

最新更新