【问题标题】:How to make a function be called every 2 ticks如何使函数每 2 个刻度调用一次
【发布时间】:2013-04-21 01:10:53
【问题描述】:

我正在为我的朋友制作一个 bukkit 插件,我想了解如何每 2 个滴答声(1/10 秒)调用一个函数。

【问题讨论】:

  • 为什么投反对票?这比询问如何使用任何其他 API 更有效? Bukkit 实际上是一个非常流行的已发布 api,如果问这个问题是无效的,你最好开始对每个 API 的问题都投反对票——MySQL、Hibernate...
  • Java Loop every minute 的可能重复项
  • @DavidZ 使用BukkitAPI 与仅使用Java 有很大不同。使用Sleep 会使整个服务器停止x 秒,从而导致延迟和许多其他问题。

标签: java repeat bukkit


【解决方案1】:

嗯,这可能不是你想看的地方。您应该使用 this 来满足您的任何开发需求。
不管怎样,我可以回答你的问题。您想使用内置的调度程序。您可以使用

server.getScheduler();

具体来说,你会想要创建一个 Runnable 并让它每 2 个滴答声调用你的方法。

int id = server.getScheduler().scheduleSyncRepeatingTask(plugin, new Runnable() {
    public void run() {
        myMethod();
    }}, 0, 2);

我将在稍后解释同步和异步的区别,但这应该可以实现您想要的。第一个参数只是对插件的引用(通常是 thisplugin)。第二个是runnable,你显然应该用你要调用的方法替换myMethod。第三个参数是方法首次运行之前的延迟量(以滴答计)。我假设为 0,但也可能是 2,具体取决于您想要做什么。最后一个参数是两次运行之间的时间量。
您会注意到该方法返回一个整数,您可以使用它来取消任务,如下所示:

server.getScheduler().cancelTask(id);

讨论异步和同步之间的区别很重要。您会注意到我们在开始时调用的方法是 scheduleSyncRepeatingTask。同步意味着我们指定为第二个参数的 Runnable 将在服务器的主线程上运行。任何调用 Bukkit/CraftBukkit/Minecraft 方法的方法都必须作为同步运行。如果你运行一些东西,修改一个块,作为异步你可能会完全破坏服务器。只是不要这样做;)另一方面,异步为 Runnable 创建一个单独的线程,用于后台任务,例如复制和粘贴文件或检查时间。再一次,从不运行一个将世界修改为异步的方法。

最后,如果你以后只想运行一个方法然后不让它重复,你可以使用方法int id = scheduleSyncDelayedTask(plugin, Runnable, 2),前两个参数相同,第三个是延迟,直到runnable 正在运行(滴答声)

祝你好运,
提示

【讨论】:

  • 生成实体是否也计入 bukkit/craftbukkit/minecraft 方法?或者我可以使用异步运行这些命令吗?
  • @xorinzor 你应该同步运行它。
  • @Tips48 你在myMethod(); 之后缺少一个右花括号。
猜你喜欢
  • 1970-01-01
  • 2017-11-15
  • 2017-11-22
  • 2017-07-18
  • 1970-01-01
  • 2023-03-16
  • 1970-01-01
  • 2016-07-08
  • 2021-12-09
相关资源
最近更新 更多