Sök…


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

Anmärkningar

Få Bukkit API-metoder är tråd-säkra och kan kallas asynkront. Av denna anledning bör Bukkit API-metoder endast , med några få undantag, köras på huvudtråden.

Kodkörning inuti scheduleSync metoder, samt runTask metoden körs på huvudtråden.

runTaskAsynchronously inuti runTaskAsynchronously körs asynkront från huvudtråden. Asynkrona metoder är mycket användbara för att utföra stora matematik- eller databasoperationer utan att fördröja servern, men kommer ändå att orsaka odefinierat beteende om de används för att ringa Bukkit API-metoder. Av denna anledning bör Bukkit API-metoder som ska köras efter den asynkrona koden alltid läggas i en runTask metod.

Schemaläggare Upprepande uppgift

Tiden för schemaläggningsuppgifter mäts i fästingar. Under normala förhållanden finns det 20 fästingar per sekund.

Uppgifter schemalagda med .scheduleSyncRepeatingTask kommer att köras på huvudtråden

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 försenad uppgift

Tiden för schemaläggningsuppgifter mäts i fästingar. Under normala förhållanden finns det 20 fästingar per sekund.

Uppgifter schemalagda med .scheduleSyncDelayedTask kommer att köras på huvudtråden

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

Köra uppgifter asynkront

Du kan låta kod köras asynkront från runTaskAsynchronously med runTaskAsynchronously . Detta är användbart för att utföra intensiva matematik- eller databasåtgärder, eftersom de kommer att förhindra att huvudtråden fryser (och servern släpar efter).

Få Bukkit API-metoder är tråd-säkra, så många kommer att orsaka odefinierat beteende om de kallas asynkront från huvudtråden.

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

Köra uppgifter på huvudtråden

Du kan också låta kod köras synkront med runTask med runTask . Detta är användbart när du vill ringa Bukkit API-metoder efter att ha kört kod asynkront från huvudtråden.

Koden som anropas inuti detta Runnable kommer att köras på huvudtråden, vilket gör det säkert att kalla Bukkit API-metoder.

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

Att köra en BukkitRunnable

BukkitRunnable är en Runnable som finns i Bukkit. Det är möjligt att schemalägga en uppgift direkt från en BukkitRunnable, och också avbryta den inifrån sig själv.

Viktigt: Tiden för uppgifterna mäts i fästingar. En sekund har 20 fästingar.

Icke-RepeatingTask:

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.

Upprepande uppgift:

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.

Kör trådkod från en asynkron uppgift

Ibland måste du köra synkron kod från en asynkron uppgift. För att göra detta, schemalägg bara en synkron uppgift från det asynkrona blocket.

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
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow