bukkit
Программирование планировщика
Поиск…
Синтаксис
-
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);
замечания
Несколько методов API Bukkit являются потокобезопасными и могут быть вызваны асинхронно. По этой причине методы API Bukkit по- русски следует только, с некоторыми исключениями, будут работать в основном потоке.
Код запуска внутри scheduleSync
методов, а также runTask
метод будет работать в основном потоке.
Код, запускаемый внутри runTaskAsynchronously
будет выполняться асинхронно из основного потока. Асинхронные методы очень полезны для выполнения больших математических операций или операций с базой данных без задержки сервера, но при этом будут вызывать неопределенное поведение, если они используются для вызова методов Bukkit API. По этой причине методы API Bukkit, которые должны запускаться после асинхронного кода, всегда должны быть помещены в метод runTask
.
Задача повторения планировщика
Время для задач планировщика измеряется в Ticks. В нормальных условиях 20 тиков в секунду.
Задачи, запланированные с помощью .scheduleSyncRepeatingTask
будут запускаться в главной теме
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
Запланированная задача планировщика
Время для задач планировщика измеряется в Ticks. В нормальных условиях 20 тиков в секунду.
Задачи, запланированные с помощью .scheduleSyncDelayedTask
будут запускаться в главной теме
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
Выполнение задач асинхронно
Вы можете сделать асинхронный запуск кода из основного потока с помощью runTaskAsynchronously
. Это полезно для выполнения интенсивных математических операций или операций с базой данных, поскольку они предотвратят замораживание основного потока (и сервер от запаздывания).
Несколько методов API Bukkit являются потокобезопасными, поэтому многие вызовут неопределенное поведение, если они будут асинхронно вызваны из основного потока.
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
}
});
Выполнение задач на главной теме
Вы также можете сделать код, выполняемый синхронно с основным потоком, используя runTask
. Это полезно, если вы хотите вызвать методы API Bukkit после асинхронного запуска кода из основного потока.
Код, вызываемый внутри этого Runnable, будет выполняться в основном потоке, что делает его безопасным для вызова методов Bukkit API.
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
}
});
Запуск BukkitRunnable
BukkitRunnable - Runnable, найденный в Bukkit. Можно запланировать задачу непосредственно из BukkitRunnable, а также отменить ее изнутри.
Важно: время выполнения задач измеряется в Ticks. Второй имеет 20 тиков.
Non-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.
Повторяющаяся задача:
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.
Запуск безопасного кода потока из асинхронной задачи
Иногда вам нужно выполнить синхронный код из асинхронной задачи. Для этого просто планируйте синхронную задачу из асинхронного блока.
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);