(→具体例) |
|||
1行目: | 1行目: | ||
− | == | + | == スケジューラのプログラミング == |
− | |||
− | + | このチュートリアルでは、bukkit によって提供されているスケジューラの使用方法をガイドします。<br> | |
+ | スケジューラは、指定の時間後に実行される処理を書くことができます。<br> | ||
+ | これはリスナーやイベントへの応答で実行されるコードの記述方法とは異なります。<br> | ||
+ | また、繰り返しや、遅延の有無を設定したりすることもできます。この繰り返し処理は、処理が完了するか、キャンセルされるか、プラグインが無効になるまで実行できます。 | ||
− | + | == BukkitRunnable == | |
− | |||
− | |||
− | + | BukkitRunnableは、 抽象クラスRunnableの実装クラスです。<br> | |
+ | Runnableに無い便利な機能として、自身の処理を再スケジュールしたり、キャンセルしたりできることです。しかし、もしBukkitRunnableが自分自身をスケジュールしていない場合、自分自身でキャンセルを行うことができません。BukkitRunnableはスケジューラではないので、スケジューラのロジックを含んでいません。 | ||
− | + | == 定義方法の例 == | |
− | |||
− | |||
− | |||
− | + | スケジューラの処理を定義するには、まず BukkitRunnable を extends しましょう。 | |
− | |||
− | |||
− | + | 例 | |
− | + | これはスケジュール処理のタスク定義の例です。 | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
<blockquote><source lang="java"> | <blockquote><source lang="java"> | ||
− | + | import org.bukkit.Bukkit; | |
− | + | import org.bukkit.plugin.java.JavaPlugin; | |
− | + | import org.bukkit.scheduler.BukkitRunnable; | |
− | + | ||
− | + | public class ExampleTask extends BukkitRunnable { | |
− | } | + | |
+ | private final JavaPlugin plugin; | ||
+ | |||
+ | public ExampleTask(JavaPlugin plugin) { | ||
+ | this.plugin = plugin; | ||
+ | } | ||
+ | |||
+ | public void run() { | ||
+ | // スケジュールで実行する処理の内容をここに書きます。 | ||
+ | plugin.getServer().broadcastMessage("サーバーへようこそ!説明文をちゃんと読んでね!"); | ||
+ | } | ||
+ | } | ||
</source></blockquote> | </source></blockquote> | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | == | + | == 作業のスケジューリング == |
− | + | タスクを定義した後、プラグインは、タスクをスケジュールする必要があります。<br> | |
+ | BukkitRunnable は、指定の時間になったら、タスクのインスタンスが起動され、メソッドが実行されます。<br> | ||
+ | 詳細は、BukkitRunnableのjavadoc を参照してください。<br> | ||
+ | これらのメソッドは共通して、BukkitTaskクラスのオブジェクトを返します。 | ||
− | + | :'''重要''': '''非同期実行タスクは、BukkitのAPIを直接実行してはいけません。''' | |
− | + | 例 | |
− | + | これは、20ticks(=1秒)後にタスクを実行するスケジューラを登録する実装例です。 | |
<blockquote><source lang="java"> | <blockquote><source lang="java"> | ||
− | + | import org.bukkit.event.EventHandler; | |
− | + | import org.bukkit.event.Listener; | |
− | + | import org.bukkit.event.player.PlayerJoinEvent; | |
− | + | import org.bukkit.plugin.java.JavaPlugin; | |
− | + | import org.bukkit.scheduler.BukkitRunnable; | |
− | } | + | import org.bukkit.scheduler.BukkitTask; |
+ | |||
+ | public final class ExamplePlugin extends JavaPlugin { | ||
+ | |||
+ | @Override | ||
+ | public void onEnable() { | ||
+ | new ExampleListener(this); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | class ExampleListener implements Listener { | ||
+ | |||
+ | private final ExamplePlugin plugin; | ||
+ | |||
+ | public ExampleListener(ExamplePlugin plugin) { | ||
+ | this.plugin = plugin; | ||
+ | plugin.getServer().getPluginManager().registerEvents(this, plugin); | ||
+ | } | ||
+ | |||
+ | @EventHandler | ||
+ | public void onJoin(PlayerJoinEvent event) { | ||
+ | BukkitTask task = new ExampleTask(this).runTaskLater(plugin, 20); | ||
+ | } | ||
+ | } | ||
</source></blockquote> | </source></blockquote> | ||
− | + | == BukkitScheduler == | |
− | |||
− | |||
− | == | ||
− | |||
− | |||
− | |||
− | |||
− | + | BukkitSchedulerは、[http://docs.oracle.com/javase/1.5.0/docs/api/index.html?java/lang/Runnable.html Runnable]クラスや[http://docs.oracle.com/javase/1.5.0/docs/api/index.html?java/util/concurrent/Callable.html Callable]クラスの、どちらかまたは両方を実装したクラスを、一定時間後に実行する機能を提供します。<br> | |
− | + | 詳細は、[http://jd.bukkit.org/rb/apidocs/index.html?org/bukkit/scheduler/BukkitScheduler.html BukkitSchedulerのjavadoc] を参照してください。 | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | :'''重要''': '''非同期実行タスクは、BukkitのAPIを直接実行してはいけません。''' | |
− | ===== | + | === BukkitTask === |
− | |||
− | |||
− | < | + | BukkitTaskクラスのオブジェクトは、Runnableがスケジュールされたときに返されます。<br> |
+ | このオブジェクトは、スケジューラにより実行されるスケジュールタスクを表現しています。<br> | ||
+ | 詳細は、[http://jd.bukkit.org/rb/apidocs/index.html?org/bukkit/scheduler/BukkitTask.html BukkitTaskのjavadoc] を参照してください。 | ||
− | + | === Callable と Future === | |
− | + | Callableクラスは、同期処理を呼び出したときに、[http://docs.oracle.com/javase/1.5.0/docs/api/index.html?java/util/concurrent/Future.html Future]クラスのオブジェクトを返します。<br> | |
+ | これはJavaで提供されている機能やクラスです。<br> | ||
+ | 詳細は、[http://docs.oracle.com/javase/1.5.0/docs/api/index.html?java/util/concurrent/Callable.html Callableのjavadoc] や、[http://docs.oracle.com/javase/1.5.0/docs/api/index.html?java/util/concurrent/Future.html Futureのjavadoc] を参照してください。 | ||
− | + | == スレッドの安全性のためのヒント == | |
− | + | 1. 非同期実行タスクは、BukkitのAPIを直接実行してはいけません。<br> | |
− | + | 2. 非同期タスクのコレクションにアクセスしたり、内容を変更しないでください。通常のコレクションはスレッドセーフではありません。<br> | |
− | + | 3. 非同期タスクは、同期タスクをスケジュールすることができます。<br> | |
− | + | 4. 同期タスク非同期タスクをスケジュールすることができます。 | |
− | |||
− | |||
− | |||
− | |||
− | |||
− |
2013年4月28日 (日) 13:21時点における版
目次
スケジューラのプログラミング
このチュートリアルでは、bukkit によって提供されているスケジューラの使用方法をガイドします。
スケジューラは、指定の時間後に実行される処理を書くことができます。
これはリスナーやイベントへの応答で実行されるコードの記述方法とは異なります。
また、繰り返しや、遅延の有無を設定したりすることもできます。この繰り返し処理は、処理が完了するか、キャンセルされるか、プラグインが無効になるまで実行できます。
BukkitRunnable
BukkitRunnableは、 抽象クラスRunnableの実装クラスです。
Runnableに無い便利な機能として、自身の処理を再スケジュールしたり、キャンセルしたりできることです。しかし、もしBukkitRunnableが自分自身をスケジュールしていない場合、自分自身でキャンセルを行うことができません。BukkitRunnableはスケジューラではないので、スケジューラのロジックを含んでいません。
定義方法の例
スケジューラの処理を定義するには、まず BukkitRunnable を extends しましょう。
例 これはスケジュール処理のタスク定義の例です。
import org.bukkit.Bukkit; import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.scheduler.BukkitRunnable; public class ExampleTask extends BukkitRunnable { private final JavaPlugin plugin; public ExampleTask(JavaPlugin plugin) { this.plugin = plugin; } public void run() { // スケジュールで実行する処理の内容をここに書きます。 plugin.getServer().broadcastMessage("サーバーへようこそ!説明文をちゃんと読んでね!"); } }
作業のスケジューリング
タスクを定義した後、プラグインは、タスクをスケジュールする必要があります。
BukkitRunnable は、指定の時間になったら、タスクのインスタンスが起動され、メソッドが実行されます。
詳細は、BukkitRunnableのjavadoc を参照してください。
これらのメソッドは共通して、BukkitTaskクラスのオブジェクトを返します。
- 重要: 非同期実行タスクは、BukkitのAPIを直接実行してはいけません。
例 これは、20ticks(=1秒)後にタスクを実行するスケジューラを登録する実装例です。
import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.scheduler.BukkitTask; public final class ExamplePlugin extends JavaPlugin { @Override public void onEnable() { new ExampleListener(this); } } class ExampleListener implements Listener { private final ExamplePlugin plugin; public ExampleListener(ExamplePlugin plugin) { this.plugin = plugin; plugin.getServer().getPluginManager().registerEvents(this, plugin); } @EventHandler public void onJoin(PlayerJoinEvent event) { BukkitTask task = new ExampleTask(this).runTaskLater(plugin, 20); } }
BukkitScheduler
BukkitSchedulerは、RunnableクラスやCallableクラスの、どちらかまたは両方を実装したクラスを、一定時間後に実行する機能を提供します。
詳細は、BukkitSchedulerのjavadoc を参照してください。
- 重要: 非同期実行タスクは、BukkitのAPIを直接実行してはいけません。
BukkitTask
BukkitTaskクラスのオブジェクトは、Runnableがスケジュールされたときに返されます。
このオブジェクトは、スケジューラにより実行されるスケジュールタスクを表現しています。
詳細は、BukkitTaskのjavadoc を参照してください。
Callable と Future
Callableクラスは、同期処理を呼び出したときに、Futureクラスのオブジェクトを返します。
これはJavaで提供されている機能やクラスです。
詳細は、Callableのjavadoc や、Futureのjavadoc を参照してください。
スレッドの安全性のためのヒント
1. 非同期実行タスクは、BukkitのAPIを直接実行してはいけません。
2. 非同期タスクのコレクションにアクセスしたり、内容を変更しないでください。通常のコレクションはスレッドセーフではありません。
3. 非同期タスクは、同期タスクをスケジュールすることができます。
4. 同期タスク非同期タスクをスケジュールすることができます。