モジュール java.base
パッケージ java.util.concurrent

インタフェースExecutorService

すべてのスーパー・インタフェース:
AutoCloseable, Executor
既知のすべてのサブインタフェース:
ScheduledExecutorService
既知のすべての実装クラス:
AbstractExecutorService, ForkJoinPool, ScheduledThreadPoolExecutor, ThreadPoolExecutor

public interface ExecutorService extends Executor, AutoCloseable
終了を管理するメソッド、および1つ以上の非同期タスクの進行状況を追跡するFutureを生成できるメソッドを提供するExecutorです。

ExecutorServiceはシャットダウンすることができ、それにより、新しいタスクを拒否するようになります。 ExecutorServiceをシャットダウンするための2つの異なるメソッドが提供されています。 shutdown()メソッドは以前に送信したタスクを終了前に実行することができ、shutdownNow()メソッドは待機中のタスクが開始されないようにし、現在実行中のタスクを停止しようとします。 終了時、executorには、実行中のアクティブなタスクや実行を待機中のタスクは存在せず、新規タスクを送信することもできません。 未使用のExecutorServiceは、そのリソースの再利用を可能にするために、シャットダウンするようにしてください。

submitメソッドは、実行の取消しまたは完了の待機、あるいはその両方に使用できるFutureを作成して返すことによって、基底メソッドExecutor.execute(Runnable)を拡張します。 invokeAnyメソッドとinvokeAllメソッドは、タスクのコレクションを実行してから、少なくとも1つまたはすべてのタスクの完了を待機することによって、もっとも一般的に役立つ形式の一括実行を行います。 (ExecutorCompletionServiceクラスを使用すると、これらのメソッドのカスタマイズされたバリアントを記述できます。)

Executorsクラスは、このパッケージで提供されるexecutorサービスのためのファクトリ・メソッドを提供します。

使用例

次に示すネットワーク・サービスの概略では、要求が着信するスレッド・プール・サービス内のスレッドを示します。 これは、事前に構成されたExecutors.newFixedThreadPool(int)ファクトリ・メソッドを使用します。
 
 class NetworkService implements Runnable {
   private final ServerSocket serverSocket;
   private final ExecutorService pool;

   public NetworkService(int port, int poolSize)
       throws IOException {
     serverSocket = new ServerSocket(port);
     pool = Executors.newFixedThreadPool(poolSize);
   }

   public void run() { // run the service
     try {
       for (;;) {
         pool.execute(new Handler(serverSocket.accept()));
       }
     } catch (IOException ex) {
       pool.shutdown();
     }
   }
 }

 class Handler implements Runnable {
   private final Socket socket;
   Handler(Socket socket) { this.socket = socket; }
   public void run() {
     // read and service request on socket
   }
 }
ExecutorServiceは、次のように(シャットダウン、終了までブロック)を確立およびクローズすることもできます。別のExecutorsファクトリ・メソッドを使用して説明します:
 
 try (ExecutorService e =  Executors.newWorkStealingPool()) {
   // submit or execute many tasks with e ...
 }
さらにカスタマイズすることもできます。 たとえば、次のメソッドは、ExecutorServiceを2つのフェーズでシャットダウンします。まず、shutdownをコールして受信タスクを拒否し、必要に応じてshutdownNowをコールしてリング・タスクを取り消します:
 
 void shutdownAndAwaitTermination(ExecutorService pool) {
   pool.shutdown(); // Disable new tasks from being submitted
   try {
     // Wait a while for existing tasks to terminate
     if (!pool.awaitTermination(60, TimeUnit.SECONDS)) {
       pool.shutdownNow(); // Cancel currently executing tasks
       // Wait a while for tasks to respond to being cancelled
       if (!pool.awaitTermination(60, TimeUnit.SECONDS))
           System.err.println("Pool did not terminate");
     }
   } catch (InterruptedException ex) {
     // (Re-)Cancel if current thread also interrupted
     pool.shutdownNow();
     // Preserve interrupt status
     Thread.currentThread().interrupt();
   }
 }

メモリー整合性効果: RunnableまたはCallableタスクをExecutorServiceに送信する前のスレッド内のアクションは、そのタスクによって実行されるすべてのアクションの前に発生し、それらがさらに、Future.get()によって結果が取得される前に発生します。

導入されたバージョン:
1.5