Suche…


Syntax

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

Bemerkungen

Nur wenige Bukkit-API-Methoden sind threadsicher und können asynchron aufgerufen werden. Aus diesem Grunde sollten Bukkit API - Methoden nur mit wenigen Ausnahmen auf dem Haupt - Thread ausgeführt werden.

Code, der innerhalb von scheduleSync Methoden ausgeführt wird, sowie die runTask Methode werden im Hauptthread ausgeführt.

Code, der in runTaskAsynchronously wird, wird asynchron vom Haupt-Thread ausgeführt. Asynchrone Methoden sind sehr nützlich, um umfangreiche mathematische oder Datenbankoperationen auszuführen, ohne den Server zu verzögern. Wenn sie jedoch zum Aufruf von Bukkit-API-Methoden verwendet werden, führt dies zu undefiniertem Verhalten. Aus diesem Grund sollten Bukkit-API-Methoden, die nach dem asynchronen Code ausgeführt werden sollten, immer in eine runTask Methode runTask werden.

Scheduler Wiederholte Aufgabe

Die Zeit für Scheduler-Aufgaben wird in Ticks gemessen. Unter normalen Bedingungen gibt es 20 Ticks pro Sekunde.

Mit .scheduleSyncRepeatingTask geplante Aufgaben werden im .scheduleSyncRepeatingTask ausgeführt

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

Scheduler verzögerte Aufgabe

Die Zeit für Scheduler-Aufgaben wird in Ticks gemessen. Unter normalen Bedingungen gibt es 20 Ticks pro Sekunde.

Mit .scheduleSyncDelayedTask geplante Aufgaben werden im .scheduleSyncDelayedTask ausgeführt

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

Aufgaben asynchron ausführen

Sie können Code asynchron aus dem Hauptthread mithilfe von runTaskAsynchronously . Dies ist nützlich für intensive mathematische oder Datenbankoperationen, da sie verhindern, dass der Haupt-Thread einfriert (und der Server verzögert).

Nur wenige Bukkit-API-Methoden sind Thread-sicher. Daher führen viele zu undefiniertem Verhalten, wenn sie asynchron vom Haupt-Thread aufgerufen werden.

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

Ausführen von Aufgaben im Hauptthread

Sie können Code auch mithilfe von runTask synchron mit dem Haupt-Thread runTask . Dies ist nützlich, wenn Sie Bukkit-API-Methoden aufrufen möchten, nachdem der Code asynchron vom Hauptthread ausgeführt wurde.

Code, der in diesem Runable aufgerufen wird, wird auf dem Hauptthread ausgeführt, sodass der Aufruf von Bukkit-API-Methoden sicher ist.

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

Ausführen eines BukkitRunnable

Das BukkitRunnable ist ein Runable in Bukkit. Es ist möglich, eine Aufgabe direkt von einem BukkitRunnable aus zu planen und auch von selbst abzubrechen.

Wichtig: Die Zeit für die Aufgaben wird in Ticks gemessen. Eine Sekunde hat 20 Ticks.

Nicht wiederholender Task:

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.

Wiederholungsaufgabe:

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.

Thread-Sicherheitscode von einer asynchronen Task ausführen

Manchmal müssen Sie synchronen Code innerhalb einer asynchronen Task ausführen. Planen Sie dazu einfach eine synchrone Task innerhalb des asynchronen Blocks ein.

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
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow