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);
備考
いくつかの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);