インタフェースExecutor

既知のすべてのサブインタフェース:
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
  • メソッドのサマリー

    修飾子と型
    メソッド
    説明
    void
    execute(Runnable command)
    将来のどの時点かで、指定されたコマンドを実行します。
  • メソッドの詳細

    • execute

      void execute(Runnable command)
      将来のどの時点かで、指定されたコマンドを実行します。 コマンドは、新規スレッド内でも、プールされたスレッド内でも、呼出し側のスレッド内でも、Executor実装により随意に実行できます。
      パラメータ:
      command - 実行可能なタスク
      スロー:
      RejectedExecutionException - このタスクの実行を受け入れることができない場合
      NullPointerException - コマンドがnullの場合