bukkit
Schemaläggningsprogrammering
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);