因此,即使第一个计划实例被取消,我似乎也无法安排再次扩展bukkitrunnable的对象。
例如,当播放器右键单击
时,将执行以下代码try {
blizzard.cancel();
}
finally {
blizzard.runTaskTimer(Main.plugin, 0, 1);
}
暴雪是扩展BukkitRunnable的对象
第一次运行得很好,但无论我点击多少次都不会再次运行。我做错了什么?
**每个玩家都可以拥有自己的暴雪对象。当玩家右手用锄头点击时,暴雪会在该玩家周围的随机位置放下一个雪球。暴雪每次运行命令都会丢弃一个雪球并运行直到达到设定的运行次数。然后暴雪取消了自己。但是,安排Blizzard在运行时运行会抛出IllegalStateException,这意味着我必须取消当前的暴雪才能安排它再次运行。问题是,这样做似乎没有正确安排暴雪再次运行 - 它只在第一次安排时运行。
答案 0 :(得分:0)
默认情况下,Bukkit
即使取消后也不允许重新安排runnables。如果您了解了Thread
s,那么您将会记住,当Thread
终止时,它无法重新启动。在Bukkit
个实例时,Runnable
遵循相同的逻辑。终止(取消)Runnable
无法重新启动。如果您希望再次发生该事件,则必须创建一个新的Runnable
实例。
要多次运行Runnable
,您就走在了正确的轨道上。 BukkitScheduler.runTaskTimer
方法将重复运行任务,直到它被取消。如果您的Listener
运行Bukkit.getScheduler().runTaskTimer(Main.plugin, new Blizzard(), 0, 1);
,您的Blizzard
对象将重复运行,直到它取消为止。 (您也可以使用blizzard.runTaskTimer(Main.plugin, 0, 1);
构造函数中的Blizzard
在创建Runnable
时自动安排。{/ p>
如果您保留内部计数器的运行次数,并按run()
方法递增该计时器,则可以在Runnable
运行一定次数后取消它。