サーチ…


構文

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

備考

いくつかのBukkit APIメソッドはスレッドセーフであり、非同期に呼び出すことができます。このため、Bukkit APIメソッドは、いくつかの例外を除いて、メインスレッドでのみ実行する必要があります。

scheduleSyncメソッドの内部で実行されるコードとrunTaskメソッドは、メインスレッドで実行されます。

runTaskAsynchronously内でrunTaskAsynchronouslyされるコードは、メインスレッドから非同期に実行されます。非同期メソッドは、サーバに遅れずに大規模な数学演算やデータベース操作を行う場合に非常に便利ですが、Bukkit APIメソッドを呼び出すために使用すると未定義の動作が発生します。このため、非同期コードの後に​​実行するBukkit APIメソッドは、常にrunTaskメソッドに配置する必要があります。

スケジューラ繰り返しタスク

Scheduler Tasksの時間は、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

スケジューラ遅延タスク

Scheduler Tasksの時間は、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を使用して、メインスレッドからコードを非同期で実行させることができます。これは、メインスレッドがフリーズしたり、サーバーが遅れたりするのを防ぐので、集中的な演算やデータベース操作を行う場合に便利です。

いくつかのBukkit APIメソッドはスレッドセーフであるため、メインスレッドから非同期に呼び出されると未定義の動作が発生します。

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を使用してメインスレッドと同期してコードを実行することもできます。これは、メインスレッドからコードを非同期で実行した後にBukkit APIメソッドを呼び出す場合に便利です。

この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は、BukkitにあるRunnableです。 BukkitRunnableから直接タスクをスケジューリングし、内部からそのタスクをキャンセルすることも可能です。

重要:タスクの時間はTicksで計測されます。秒は20ティックです。

非反復タスク:

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