- 既知のすべてのサブインタフェース:
ExecutorService
,ScheduledExecutorService
- 既知のすべての実装クラス:
AbstractExecutorService
,ForkJoinPool
,ScheduledThreadPoolExecutor
,ThreadPoolExecutor
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<>();
final Executor executor;
Runnable active;
SerialExecutor(Executor executor) {
this.executor = executor;
}
public synchronized void execute(Runnable r) {
tasks.add(() -> {
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
に送信する前のスレッド内のアクションは、別のスレッドで行われる可能性のある実行の開始よりも前に発生します。
- 導入されたバージョン:
- 1.5
-
メソッドのサマリー
-
メソッドの詳細
-
execute
void execute(Runnable command) 将来のどの時点かで、指定されたコマンドを実行します。 コマンドは、新規スレッド内でも、プールされたスレッド内でも、呼出し側のスレッド内でも、Executor
実装により随意に実行できます。- パラメータ:
command
- 実行可能なタスク- 例外:
RejectedExecutionException
- このタスクの実行を受け入れることができない場合NullPointerException
- コマンドがnullの場合
-