Вопрос по java – Как вызвать функцию каждый час? Кроме того, как я могу зациклить это?

13

Мне нужен простой способ вызывать функцию каждые 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. Кроме того, как я могу зациклить это, чтобы получить каждый промежуточный блок?

Во-первых, я хочу спросить, почему вам нужно запускать функцию каждый час и использовать функцию события onPlayerInteract для запуска события, основанного на щелчке левой или правой кнопкой мыши. Это, кажется, противоречит друг другу. The Original Android

Ваш Ответ

4   ответа
26

Создать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 функция, то вы можете получить доступl1 а такжеl2, Для компиляции вам нужно пометить их обоих какfinal.

Преимущество использованияTimer Объект в том, что он может обрабатывать несколькоTimerTask объекты, каждый со своим собственным временем, задержкой и т. д. Вы также можете запускать и останавливать таймеры, пока вы удерживаетеTimer объект, объявив его как переменную класса или что-то.

Я не знаю, как получить каждый блок между ними.

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Thor Correia
Error: User Rate Limit Exceeded
2

Создайте поток, который будет работать вечно и каждый час просыпается для выполнения ваших данных.

Thread t = new Thread() {
    @Override
    public void run() {
        while(true) {
            try {
                Thread.sleep(1000*60*60);
                //your code here...
            } catch (InterruptedException ie) {
            }
        }
    }
};
t.start();
Error: User Rate Limit Exceeded Thor Correia
Error: User Rate Limit ExceededtError: User Rate Limit Exceeded
2

Вы должны использовать Bukkit Scheduler:

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

Вы должны создать метод с этим и там вы должны вызвать тот же метод.

Error: User Rate Limit Exceeded
1
  1. The simplest way (in my opinion) is use Thread (the above comment has mention about it).
  2. You can also use Timer in javax.swing.Timer
  3. But i think - as 101100 said - you can use TimerTask. You can check this link (from IBM)

Похожие вопросы