安排24个不同计时器的最有效方法

时间:2014-02-16 16:58:59

标签: java performance timer task bukkit

我目前正在使用Bukkit进行插件开发,我在文件中配置了12个首选项(一个人可以支付12种方式来飞行。)

对于每个配置(12),需要2个定时器。一个'撤回'计时器,一个'飞行检查'计时器。每个计时器都会以不同的间隔设置,所以我无法将两者结合起来。

然后,当玩家拥有12种配置之一的权限时,他/她被放置在一个数组中,分配给该配置的计时器遍历数组,运行方法来检查所需的内容。

但是,我相信还有更好的方法,除了让24个计时器在服务器启动时关闭。它看起来似乎太多了,并将成为性能的重大打击。定时器也必须是SyncDelayedTask,因为它们访问Bukkit API。

所以我想知道是否有更有效的方法来解决这个问题?

1 个答案:

答案 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语句,那么它将能够检查每一个语句,并且可以调用多个语句。