Szukaj…


Składnia

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

Uwagi

Niewiele metod API Bukkit jest bezpiecznych dla wątków i można je wywoływać asynchronicznie. Z tego powodu metody API Bukkit powinny być uruchamiane tylko z kilkoma wyjątkami w głównym wątku.

Kod uruchamiany w metodach scheduleSync , a także metoda runTask będą uruchamiane w głównym wątku.

Kod uruchamiany wewnątrz runTaskAsynchronously będzie uruchamiany asynchronicznie z głównego wątku. Metody asynchroniczne są bardzo przydatne do wykonywania dużych operacji matematycznych lub operacji na bazach danych bez opóźniania serwera, ale powodują niezdefiniowane zachowanie, jeśli są używane do wywoływania metod API Bukkit. Z tego powodu metody interfejsu API Bukkit, które powinny być uruchamiane po kodzie asynchronicznym, powinny zawsze znajdować się w metodzie runTask .

Harmonogram Powtarzanie zadania

Czas dla zadań programu planującego mierzony jest w Ticks. W normalnych warunkach występuje 20 tyknięć na sekundę.

Zadania zaplanowane za pomocą .scheduleSyncRepeatingTask będą uruchamiane w wątku głównym

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

Opóźnione zadanie harmonogramu

Czas dla zadań programu planującego mierzony jest w Ticks. W normalnych warunkach występuje 20 tyknięć na sekundę.

Zadania zaplanowane za pomocą .scheduleSyncDelayedTask będą uruchamiane w wątku głównym

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

Asynchroniczne uruchamianie zadań

Możesz uruchomić kod asynchronicznie z głównego wątku za pomocą runTaskAsynchronously . Jest to przydatne do wykonywania intensywnych operacji matematycznych lub baz danych, ponieważ zapobiegną one zawieszeniu głównego wątku (i opóźnieniu serwera).

Niewiele metod API Bukkit jest bezpiecznych dla wątków, więc wiele wywoła niezdefiniowane zachowanie, jeśli zostanie wywołane asynchronicznie z głównego wątku.

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

Uruchamianie zadań w głównym wątku

Możesz także runTask synchronizację kodu z głównym wątkiem za pomocą runTask . Jest to przydatne, gdy chcesz wywołać metody API Bukkit po uruchomieniu asynchronicznie kodu z głównego wątku.

Kod wywołany w tym Runnable zostanie wykonany w głównym wątku, dzięki czemu bezpieczne będzie wywoływanie metod API 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
    }
});

Uruchamianie BukkitRunnable

BukkitRunnable to Runnable znaleziony w Bukkit. Możliwe jest zaplanowanie zadania bezpośrednio z BukkitRunnable, a także anulowanie go od wewnątrz.

Ważne: czas na zadaniach mierzony jest w Ticks. Drugi ma 20 tyknięć.

Zadanie bez powtarzania:

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.

Powtarzające się zadanie:

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.

Uruchamianie bezpiecznego kodu wątku z zadania asynchronicznego

Czasami trzeba wykonać kod synchroniczny z zadania asynchronicznego. Aby to zrobić, po prostu zaplanuj synchroniczne zadanie z poziomu bloku asynchronicznego.

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
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow