2013-04-21 47 views
6

我正在为我的朋友做一个bukkit插件,我想找出如何每2滴答(1/10秒)调用一个函数。如何使功能被称为每2滴答

+2

为什么downvote?如何比询问如何使用任何其他API更有效? Bukkit实际上是一个非常受欢迎的已发布api,如果无法提出有关您最好开始有关每个API的低级投票问题的问题 - MySQL,Hibernate ... – 2013-04-21 03:37:27

+0

[Java Loop每分钟](http: //download.stackoverflow.com/questions/2702980/java-loop-every-minute) – 2013-04-22 06:25:58

+3

@DavidZ使用'BukkitAPI'这个和使用'Java'完全不同。使用'Sleep'会使整个服务器停止'x'秒,导致滞后和其他许多问题。 – Jojodmo 2014-02-23 01:53:13

回答

14

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

server.getScheduler(); 

具体来说,您会希望创建一个Runnable并使其打电话给你的方法,每2个蜱访问它。

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

我将在一秒内解释同步和异步的区别,但这应该完成你想要的。第一个参数只是对插件的引用(通常为thisplugin)。第二个是可运行的,你应该用你想调用的方法替换myMethod。第三个参数是延迟量(以滴答为单位),直到方法第一次运行。我假设为0,但也可能是两个,取决于你想要做什么。最后一个参数是两次运行之间的时间量,你希望是两次。
你会发现,该方法返回一个整数,你可以用它来取消任务,像这样:

server.getScheduler().cancelTask(id); 

它讨论异步和同步之间的区别是很重要的。您会注意到我们在开始时调用的方法说时间表同步 RepeatingTask。同步意味着我们指定为第二个参数的Runnable将在服务器的主线程上运行。任何调用Bukkit/CraftBukkit/Minecraft方法的方法都必须作为同步运行。如果你运行一些说,修改块,作为异步你可以完全破坏服务器。只是不这样做;)另一方面,异步为Runnable创建一个单独的线程,用于后台任务,如复制和粘贴文件或检查它是什么时间。再次,从不运行一种方法,将修改世界为异步。最后,如果您以后只想运行一次方法但没有重复,您可以使用方法int id = scheduleSyncDelayedTask(plugin, Runnable, 2),前两个参数相同,第三个延迟直到可运行运行(蜱)

祝你好运,
提示

+0

确实产卵实体还计入Bukkit/craftbukkit/minecraft方法吗?或者我可以使用ASync运行这些命令吗? – xorinzor 2014-07-11 15:19:52

+0

@xorinzor你应该同步运行。 – 2015-01-24 13:50:15

+0

@ Tips48'myMethod();'后面缺少一个大括号。 – Chad 2015-07-03 22:44:04