我目前正在使用Bukkit进行插件开发,我在文件中配置了12个首选项(一个人可以支付12种方式来飞行。)
对于每个配置(12),需要2个定时器。一个'撤回'计时器,一个'飞行检查'计时器。每个计时器都会以不同的间隔设置,所以我无法将两者结合起来。
然后,当玩家拥有12种配置之一的权限时,他/她被放置在一个数组中,分配给该配置的计时器遍历数组,运行方法来检查所需的内容。
但是,我相信还有更好的方法,除了让24个计时器在服务器启动时关闭。它看起来似乎太多了,并将成为性能的重大打击。定时器也必须是SyncDelayedTask,因为它们访问Bukkit API。
所以我想知道是否有更有效的方法来解决这个问题?
答案 0 :(得分:0)
有一种方法可以在不设置24个独立计时器的情况下完成此操作。您可以创建一个,时间间隔为1
。然后,每次定时器运行时,您都可以向数字添加一个。像这样:
int loops;
this.getServer().getScheduler().scheduleSyncRepeatingTask(this, new Runnable(){
public void run() {
loops++;//add one to the loops
}
},1, 1);
然后,对于每个时间间隔,您可以设置一个检查,以查看loops
是否可以按时间间隔整除...例如,让我们说您希望拥有{fly check
1}}每5个滴答,以及每7个滴答的withdraw
计时器。你可以这样做:
int loops;
this.getServer().getScheduler().scheduleSyncRepeatingTask(this, new Runnable(){
public void run() {
loops++;//add one to the loops
if(loops % 5 == 0){//if loops is divisible by 5
//fly check code
}
if(loops % 7 == 0){//if loops is divisible by 7
//withdraw code
}
}
},1, 1); //make the timer repeat every 1 tick
请确保您只使用if
语句,而不是else if
。如果你使用上面的else if
,并且循环是35,它可以被5和7整除,它将运行第一个语句,但不运行第二个语句,因为你告诉它只在上面的语句运行时才运行该语句假。因此,如果您只使用if
语句,那么它将能够检查每一个语句,并且可以调用多个语句。