2012-05-25 8 views
11

Necesito una forma simple de llamar a una función cada 60 minutos. ¿Cómo puedo hacer esto? Estoy haciendo un plugin bukkit Minecraft, y esto es lo que tengo:¿Cómo llamar a la función cada hora? Además, ¿cómo puedo iterar esto?

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(); 
     } 
    } 
} 

necesito para ejecutar una función voy a aplicar a cada hora, ¿cómo? Recuerde: la función usará l1 y l2. Además, ¿cómo puedo buclear esto para obtener cada bloque entremedio?

+0

En primer lugar, quiero preguntar por qué necesita ejecutar una función cada hora y usar la función de evento en PlayerInteract para desencadenar un evento basado en el clic izquierdo o derecho. Esto parece contradecirse entre sí. –

Respuesta

24

crear un objeto Timer y darle un TimerTask que realiza el código desea realizar.

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); 

Si se declara hourlyTask dentro de su función onPlayerInteract, entonces se puede acceder l1 y l2. Para hacer esa compilación, deberá marcarlos a ambos como final.

La ventaja de utilizar un objeto Timer es que puede manejar múltiples TimerTask objetos, cada uno con su propio calendario, retardo, etc. También puede iniciar y detener los contadores de tiempo, siempre y cuando usted se aferra al objeto Timer declarando como una variable de clase o algo.

No sé cómo obtener cada bloque en el medio.

+0

Todavía no puedo acceder a l1. –

+1

Yo votaría para usar la clase Timer en lugar de Thread, como otros podrían. El motivo es que Timer utiliza el temporizador/reloj del sistema para activar la llamada a la función. Por lo tanto, el tiempo debe ser tan preciso como sea posible. Mientras que el uso de subprocesos dependerá de la gestión de subprocesos de Java y del sistema operativo, es bastante complicado de predecir. –

+0

@Plazmotech, Deberá agregar código para acceder al objeto local l1 o l2, que proviene de una función basada en eventos. Lo dejaré así por ahora. –

2

Cree un hilo que se ejecutará para siempre y se activa cada hora para ejecutar sus datos.

Thread t = new Thread() { 
    @Override 
    public void run() { 
     while(true) { 
      try { 
       Thread.sleep(1000*60*60); 
       //your code here... 
      } catch (InterruptedException ie) { 
      } 
     } 
    } 
}; 
t.start(); 
+0

Thannks! Error de sintaxis en el token "t", VariableDeclaratorId esperado después de este token –

+0

Sí, olvidé agregar un punto y coma al final de la declaración 't'. Ya lo agregué. –

1
  1. La manera más simple (en mi opinión) es usar Thread (el comentario anterior tiene una mención al respecto).
  2. También puede utilizar Timer en javax.swing.Timer
  3. pero creo que - como se dijo 101100 - puede utilizar TimerTask. Esto se puede comprobar link (de IBM)
2

Debe utilizar Bukkit Programador:

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

debe crear un método con esto y no se debe llamar al mismo método.

+0

Cuando el servidor se está quedando <20tps, el tiempo ya no es preciso. –

Cuestiones relacionadas