Buscar..


Sintaxis

  • Bukkit.getScheduler().scheduleSyncRepeatingTask(Plugin plugin, Runnable task, int initialDelay, int repeatingDelay)
  • Bukkit.getScheduler().scheduleSyncDelayedTask(Plugin plugin, Runnable task, int initialDelay)
  • Bukkit.getScheduler().runTaskAsynchronously(Plugin plugin, Runnable task)
  • Bukkit.getScheduler().runTask(Plugin plugin, Runnable task)
  • new BukkitRunnable() { @Override public void run() { /* CODE */ } }.runTaskLater(Plugin plugin, long delay);
  • new BukkitRunnable() { @Override public void run() { /* CODE */ } }.runTaskTimer(Plugin plugin, long initialDelay, long repeatingDelay);

Observaciones

Pocos métodos de la API de Bukkit son seguros para subprocesos y se pueden llamar de forma asíncrona. Por esta razón, los métodos de la API de Bukkit solo deben ejecutarse, con algunas excepciones, en el hilo principal.

El código ejecutado dentro de scheduleSync métodos scheduleSync , así como el método runTask se ejecutarán en el hilo principal.

El código ejecutado dentro de runTaskAsynchronously se ejecutará de forma asíncrona desde el hilo principal. Los métodos asíncronos son muy útiles para realizar grandes operaciones matemáticas o de base de datos sin retrasar el servidor, pero causarán un comportamiento indefinido si se usan para llamar a los métodos de la API de Bukkit. Por esta razón, los métodos de la API de Bukkit que deben ejecutarse después del código asíncrono siempre deben ponerse en un método runTask .

Programador repitiendo tarea

El tiempo para las tareas del programador se mide en ticks. En condiciones normales, hay 20 garrapatas por segundo.

Las tareas programadas con .scheduleSyncRepeatingTask se ejecutarán en el subproceso principal

Bukkit.getScheduler().scheduleSyncRepeatingTask(plugin, new Runnable() {
    @Override
    public void run() {
        Bukkit.broadcastMessage("This message is shown immediately and then repeated every second");
    }
}, 0L, 20L); //0 Tick initial delay, 20 Tick (1 Second) between repeats

Programador de tareas retrasadas

El tiempo para las tareas del programador se mide en ticks. En condiciones normales, hay 20 garrapatas por segundo.

Las tareas programadas con .scheduleSyncDelayedTask se ejecutarán en el subproceso principal

Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, new Runnable() {
    @Override
    public void run() {
        Bukkit.broadcastMessage("This message is shown after one second");
    }
}, 20L); //20 Tick (1 Second) delay before run() is called

Ejecutar tareas de forma asíncrona

Puede hacer que el código se ejecute de forma asíncrona desde el hilo principal usando runTaskAsynchronously . Esto es útil para realizar operaciones intensivas de matemáticas o bases de datos, ya que evitarán que el hilo principal se congele (y que el servidor se retrase).

Algunos métodos de la API de Bukkit son seguros para la ejecución de subprocesos, por lo que muchos causarán un comportamiento indefinido si se los llama de forma asíncrona desde el subproceso principal.

Bukkit.getScheduler().runTaskAsynchronously(plugin, new Runnable() {
    @Override
    public void run() {
        Bukkit.getLogger().info("This message was printed to the console asynchronously");
        //Bukkit.broadcastMessage is not thread-safe
    }
});

Ejecutando tareas en el hilo principal

También puede hacer que el código se ejecute de forma síncrona con el hilo principal utilizando runTask . Esto es útil cuando desea llamar a los métodos de la API de Bukkit después de ejecutar el código de forma asíncrona desde el hilo principal.

El código llamado dentro de este Runnable se ejecutará en el subproceso principal, haciendo que sea seguro llamar a los métodos API de Bukkit.

Bukkit.getScheduler().runTask(plugin, new Runnable() {
    @Override
    public void run() {
        Bukkit.broadcastMessage("This message is displayed to the server on the main thread");
        //Bukkit.broadcastMessage is thread-safe
    }
});

Ejecutando un BukkitRunnable

El BukkitRunnable es un Runnable que se encuentra en Bukkit. Es posible programar una tarea directamente desde un BukkitRunnable, y también cancelarla desde su interior.

Importante: El tiempo en las tareas se mide en Ticks. Un segundo tiene 20 garrapatas.

Tarea no repetitiva:

JavaPlugin plugin;    //Your plugin instance    
Long timeInSeconds = 10;
Long timeInTicks = 20 * timeInSeconds;
new BukkitRunnable() {
        
    @Override
    public void run() {
        //The code inside will be executed in {timeInTicks} ticks.
        
    }
}.runTaskLater(plugin, timeInTicks);   // Your plugin instance, the time to be delayed.

Repitiendo la tarea:

JavaPlugin plugin;    //Your plugin instance    
Long timeInSeconds = 10;
Long timeInTicks = 20 * timeInSeconds;
new BukkitRunnable() {
        
    @Override
    public void run() {
        //The code inside will be executed in {timeInTicks} ticks.
       //After that, it'll be re-executed every {timeInTicks} ticks;
      //Task can also cancel itself from running, if you want to.

       if (boolean) {
           this.cancel();
       }
        
    }
}.runTaskTimer(plugin, timeInTicks, timeInTicks);   //Your plugin instance, 
                                                   //the time to wait until first execution,
                                                  //the time inbetween executions.

Ejecución de código seguro de subproceso desde una tarea asíncrona

A veces necesitará ejecutar código síncrono desde una tarea asíncrona. Para hacer esto, simplemente programe una tarea síncrona desde dentro del bloque asíncrono.

Bukkit.getScheduler().runTaskTimerAsynchronously(VoidFlame.getPlugin(), () -> {

    Bukkit.getScheduler().runTask(VoidFlame.getPlugin(), () -> {
        World world = Bukkit.getWorld("world");
        world.spawnEntity(new Location(world, 0, 100, 0), EntityType.PRIMED_TNT);
    });

}, 0L, 20L);


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow