Поиск…


Синтаксис

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


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow