public interface Executor
Runnable
タスクを実行するオブジェクトです。このインタフェースは、タスク送信を各タスクの実行方式 (スレッドの使用やスケジューリングの詳細などを含む) から分離する方法を提供します。通常、Executor は、明示的にスレッドを作成する代わりに使用されます。たとえば、タスクセットごとに new Thread(new(RunnableTask())).start() を呼び出す代わりに、次を使用できます。
Executor executor = anExecutor; executor.execute(new RunnableTask1()); executor.execute(new RunnableTask2()); ...ただし、Executor インタフェースでは、実行が非同期であることが厳密に求められるわけではありません。もっとも単純なケースでは、executor は、送信されたタスクを呼び出し側のスレッド内でただちに実行できます。
class DirectExecutor implements Executor { public void execute(Runnable r) { r.run(); } }より一般的には、タスクは呼び出し側のスレッド以外のスレッドで実行されます。次に示す executor は、各タスク用の新規スレッドを生成します。
class ThreadPerTaskExecutor implements Executor { public void execute(Runnable r) { new Thread(r).start(); } }多数の Executor 実装は、タスクをスケジュールする方法および時期に関して何らかの制限を課します。次に、executor がタスクの送信を直列化して 2 番目の executor に渡す、複合 executor を示します。
class SerialExecutor implements Executor {
final Queue<Runnable> tasks = new ArrayDeque<Runnable>();
final Executor executor;
Runnable active;
SerialExecutor(Executor executor) {
this.executor = executor;
}
public synchronized void execute(final Runnable r) {
tasks.offer(new Runnable() {
public void run() {
try {
r.run();
} finally {
scheduleNext();
}
}
});
if (active == null) {
scheduleNext();
}
}
protected synchronized void scheduleNext() {
if ((active = tasks.poll()) != null) {
executor.execute(active);
}
}
}
このパッケージで提供される Executor 実装は、より拡張性の高いインタフェースである ExecutorService
を実装します。ThreadPoolExecutor
クラスは、拡張可能なスレッドプール実装を提供します。Executors
クラスは、これらの Executor のための便利なファクトリメソッドを提供します。
メモリー整合性効果: Runnable
オブジェクトを Executor
に送信する前のスレッド内のアクションは、別のスレッドで行われる可能性のある実行の開始よりも前に発生します。
void execute(Runnable command)
command
- 実行可能なタスクRejectedExecutionException
- このタスクの実行を受け入れることができない場合。NullPointerException
- コマンドが null の場合 バグまたは機能を送信
詳細な API リファレンスおよび開発者ドキュメントについては、Java SE のドキュメントを参照してください。そのドキュメントには、概念的な概要、用語の定義、回避方法、有効なコード例などの、開発者を対象にしたより詳細な説明が含まれています。
Copyright © 1993, 2013, Oracle and/or its affiliates. All rights reserved.