14

我需要一种简单的方法来每 60 分钟调用一次函数。我怎样才能做到这一点?我正在制作一个 MineCraft bukkit 插件,这就是我所拥有的:

package com.webs.playsoulcraft.plazmotech.java.MineRegen;

import java.util.logging.Logger;

import org.bukkit.Location;
import org.bukkit.block.Block;
import org.bukkit.event.block.Action;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.plugin.java.JavaPlugin;


public class Main extends JavaPlugin{

    public final Logger log = Logger.getLogger("Minecraft");


    @Override
    public void onEnable() {
        this.log.info("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
        this.log.info("Plaz's Mine Regen is now enabled!");
        this.log.info("Copyright 2012 Plazmotech Co. All rights reserved.");
        this.log.info("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
    }

    @Override 
    public void onDisable() {
        this.log.info("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
        this.log.info("Plaz's Mine Regen is now disabled!");
        this.log.info("Copyright 2012 Plazmotech Co. All rights reserved.");
        this.log.info("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
    }

    public void onPlayerInteract(PlayerInteractEvent event) {
        final Action action = event.getAction();
        if (action == Action.LEFT_CLICK_BLOCK) {
            Location l1 = event.getClickedBlock().getLocation();
        } else if (action == Action.RIGHT_CLICK_BLOCK) {
            Location l2 = event.getClickedBlock().getLocation();
        }
    }
}

我需要运行一个每小时都会实现的功能,怎么做?请记住:该函数将使用 l1 和 l2。另外,我怎样才能循环这个以获取中间的每个块?

4

4 回答 4

28

创建一个Timer对象并给它一个TimerTask执行您想要执行的代码的对象。

Timer timer = new Timer ();
TimerTask hourlyTask = new TimerTask () {
    @Override
    public void run () {
        // your code here...
    }
};

// schedule the task to run starting now and then every hour...
timer.schedule (hourlyTask, 0l, 1000*60*60);

如果你hourlyTask在你的onPlayerInteract函数中声明,那么你可以访问l1and l2。要进行编译,您需要将它们都标记为final.

使用一个Timer对象的好处是它可以处理多个对象,每个对象都有自己的时间、延迟等。你也可以通过将对象声明为类变量或其他东西TimerTask来启动和停止定时器,只要你持有该对象Timer.

我不知道如何让每个街区之间。

于 2012-05-25T03:53:32.213 回答
4

创建一个将永远运行并每小时唤醒以执行数据的线程。

Thread t = new Thread() {
    @Override
    public void run() {
        while(true) {
            try {
                Thread.sleep(1000*60*60);
                //your code here...
            } catch (InterruptedException ie) {
            }
        }
    }
};
t.start();
于 2012-05-25T03:47:35.307 回答
3

您必须使用 Bukkit 调度程序:

public void Method(){
    this.getServer().getScheduler().scheduleSyncDelayedTask(this, new Runnable() {
        @Override
        public void run() {
            // Your code goes here
            Method();
        }
    }, time * 20L );
}

您必须使用它创建一个方法,并且您必须在那里调用相同的方法。

于 2013-03-31T17:00:09.340 回答
1
  1. 最简单的方法(在我看来)是使用Thread(上面的评论提到了它)。
  2. 您也可以Timerjavax.swing.Timer
  3. 但我认为——正如 101100 所说——你可以使用TimerTask. 您可以查看此链接 (来自 IBM)
于 2012-05-25T04:30:52.290 回答