bukkit
Programowanie harmonogramu
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);