Как вызывать функцию каждый час? Кроме того, как я могу это сделать?
Мне нужен простой способ вызвать функцию каждые 60 минут. Как я могу это сделать? Я делаю плагин Bukkit MineCraft, и это то, что у меня есть:
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 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 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. Кроме того, как я могу зацикливать это, чтобы получить каждый блок между ними?
Ответы
Ответ 1
Создайте объект 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
, объявив его как переменную класса или что-то в этом роде.
Я не знаю, как получить каждый блок между ними.
Ответ 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();
Ответ 3
Вы должны использовать Bukkit Scheduler:
public void Method(){
this.getServer().getScheduler().scheduleSyncDelayedTask(this, new Runnable() {
@Override
public void run() {
// Your code goes here
Method();
}
}, time * 20L );
}
Вы должны создать метод с этим, и там вы должны вызвать тот же метод.
Ответ 4
- Простейшим способом (на мой взгляд) является использование
Thread
(в приведенном выше комментарии упоминается об этом).
- Вы также можете использовать
Timer
в javax.swing.Timer
- Но я думаю, что, как сказал 101100, вы можете использовать
TimerTask
. Вы можете проверить эту ссылку (от IBM)