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

インタフェースExecutorService

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

    public interface ExecutorService
    extends Executor
    終了を管理するメソッド、および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を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 ie) {
         // (Re-)Cancel if current thread also interrupted
         pool.shutdownNow();
         // Preserve interrupt status
         Thread.currentThread().interrupt();
       }
     }

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

    導入されたバージョン:
    1.5
    • メソッドのサマリー

      すべてのメソッド インスタンス・メソッド 抽象メソッド 
      修飾子と型 メソッド 説明
      boolean awaitTermination​(long timeout, TimeUnit unit)
      シャットダウン要求後にすべてのタスクが実行を完了していたか、タイム・アウトが発生するか、現在のスレッドで割込みが発生するか、そのいずれかが最初に発生するまでブロックします。
      <T> List<Future<T>> invokeAll​(Collection<? extends Callable<T>> tasks)
      指定されたタスクを実行し、すべて完了すると、ステータスと結果を含むFutureのリストを返します。
      <T> List<Future<T>> invokeAll​(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit)
      指定されたタスクを実行し、すべてが完了するか時間切れになるか、そのいずれかが最初に発生した時点で、ステータスと結果を含むFutureのリストを返します。
      <T> T invokeAny​(Collection<? extends Callable<T>> tasks)
      指定されたタスクを実行し、例外をスローせずに正常に完了したタスクが存在する場合は、その結果を返します。
      <T> T invokeAny​(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit)
      指定されたタスクを実行し、タイム・アウトが経過する前に例外をスローせずに正常に完了したタスクが存在する場合は、その結果を返します。
      boolean isShutdown()
      このexecutorがシャットダウンしていた場合、trueを返します。
      boolean isTerminated()
      シャットダウンに続いてすべてのタスクが完了していた場合、trueを返します。
      void shutdown()
      順序正しくシャットダウンを開始します。以前に送信されたタスクが実行されますが、新規タスクは受け入れられません。
      List<Runnable> shutdownNow()
      実行中のアクティブなタスクすべての停止を試み、待機中のタスクの処理を停止し、実行を待機していたタスクのリストを返します。
      Future<?> submit​(Runnable task)
      実行用のRunnableタスクを送信し、そのタスクを表すFutureを返します。
      <T> Future<T> submit​(Runnable task, T result)
      実行用のRunnableタスクを送信し、そのタスクを表すFutureを返します。
      <T> Future<T> submit​(Callable<T> task)
      値を返す実行用タスクを送信して、保留状態のタスク結果を表すFutureを返します。
      • インタフェース java.util.concurrent.Executorで宣言されたメソッド

        execute
    • メソッドの詳細

      • shutdown

        void shutdown()
        順序正しくシャットダウンを開始します。以前に送信されたタスクが実行されますが、新規タスクは受け入れられません。 シャットダウン後に呼出しを実行しても、効果はありません。

        このメソッドは、以前に送信されたタスクが実行を完了するのを待機しません。 これを実行するには、awaitTerminationを使ってください。

        例外:
        SecurityException - セキュリティ・マネージャが存在する状況でこのExecutorServiceのシャットダウンを実行すると、呼出し側には変更を許可しないスレッドを操作できる場合。これは、RuntimePermission("modifyThread")を保持しないか、セキュリティ・マネージャのcheckAccessメソッドがアクセスを拒否するためである。
      • shutdownNow

        List<Runnable> shutdownNow()
        実行中のアクティブなタスクすべての停止を試み、待機中のタスクの処理を停止し、実行を待機していたタスクのリストを返します。

        このメソッドは、アクティブに実行中のタスクが終了するのを待機しません。 これを実行するには、awaitTerminationを使ってください。

        実行中のアクティブなタスク処理を停止するために最善の努力をすること以上の保証はありません。 たとえば、標準的な実装ではThread.interrupt()を使用して取り消すため、割り込みに応答できなかったタスクがすべて終了しなくなる可能性があります。

        戻り値:
        実行が開始されなかったタスクのリスト
        例外:
        SecurityException - セキュリティ・マネージャが存在する状況でこのExecutorServiceのシャットダウンを実行すると、呼出し側には変更を許可しないスレッドを操作できる場合。これは、RuntimePermission("modifyThread")を保持しないか、セキュリティ・マネージャのcheckAccessメソッドがアクセスを拒否するためである。
      • isShutdown

        boolean isShutdown()
        このexecutorがシャットダウンしていた場合、trueを返します。
        戻り値:
        このexecutorがシャットダウンしていた場合はtrue
      • isTerminated

        boolean isTerminated()
        シャットダウンに続いてすべてのタスクが完了していた場合、trueを返します。 shutdownまたはshutdownNowのいずれかが最初に呼び出された場合を除き、isTerminatedtrueになることはありません。
        戻り値:
        シャットダウンに続いてすべてのタスクが完了していた場合はtrue
      • awaitTermination

        boolean awaitTermination​(long timeout,
                                 TimeUnit unit)
                          throws InterruptedException
        シャットダウン要求後にすべてのタスクが実行を完了していたか、タイム・アウトが発生するか、現在のスレッドで割込みが発生するか、そのいずれかが最初に発生するまでブロックします。
        パラメータ:
        timeout - 待機する最長時間
        unit - timeout引数の時間単位
        戻り値:
        このexecutorが終了した場合はtrue、終了前にタイム・アウトが経過した場合はfalse
        例外:
        InterruptedException - 待機中に割込みが発生した場合
      • submit

        <T> Future<T> submit​(Callable<T> task)
        値を返す実行用タスクを送信して、保留状態のタスク結果を表すFutureを返します。 Futureのgetメソッドは、正常に完了した時点でタスクの結果を返します。

        タスクの待機をただちにブロックする場合は、result = exec.submit(aCallable).get();の形式の構築を使用できます。

        ノート: Executorsクラスには、クロージャに似たほかの一般オブジェクトを変換できるメソッド・セットが含まれます。たとえば、PrivilegedActionCallable形式に変換して、送信可能にすることができます。

        型パラメータ:
        T - タスクの結果の型
        パラメータ:
        task - 送信するタスク
        戻り値:
        タスクの保留完了を表すFuture
        例外:
        RejectedExecutionException - タスクの実行をスケジュールできない場合
        NullPointerException - タスクがnullの場合
      • submit

        <T> Future<T> submit​(Runnable task,
                             T result)
        実行用のRunnableタスクを送信し、そのタスクを表すFutureを返します。 Futureのgetメソッドは、正常に完了した時点で指定された結果を返します。
        型パラメータ:
        T - 結果の型
        パラメータ:
        task - 送信するタスク
        result - 返す結果
        戻り値:
        タスクの保留完了を表すFuture
        例外:
        RejectedExecutionException - タスクの実行をスケジュールできない場合
        NullPointerException - タスクがnullの場合
      • submit

        Future<?> submit​(Runnable task)
        実行用のRunnableタスクを送信し、そのタスクを表すFutureを返します。 Futureのgetメソッドは、正常に完了した時点でnullを返します。
        パラメータ:
        task - 送信するタスク
        戻り値:
        タスクの保留完了を表すFuture
        例外:
        RejectedExecutionException - タスクの実行をスケジュールできない場合
        NullPointerException - タスクがnullの場合
      • invokeAll

        <T> List<Future<T>> invokeAll​(Collection<? extends Callable<T>> tasks)
                               throws InterruptedException
        指定されたタスクを実行し、すべて完了すると、ステータスと結果を含むFutureのリストを返します。 返されるリストの各要素に対してFuture.isDone()trueになります。 完了したタスクは、通常どおりか例外をスローすることで終了しています。 オペレーションの進行中に、指定されたコレクションが変更された場合、このメソッドの結果は定義されていません。
        型パラメータ:
        T - タスクから返される値の型
        パラメータ:
        tasks - タスクのコレクション
        戻り値:
        タスクを表すFutureのリスト。リストの順序は、指定されたタスク・リストのイテレータにより生成される順序と同じで、各タスクは完了済みです。
        例外:
        InterruptedException - 待機中に割込みが発生した場合。この場合、未完了のタスクは取り消されます
        NullPointerException - タスクまたはそのいずれかの要素がnullの場合
        RejectedExecutionException - いずれかのタスクの実行をスケジュールできない場合
      • invokeAll

        <T> List<Future<T>> invokeAll​(Collection<? extends Callable<T>> tasks,
                                      long timeout,
                                      TimeUnit unit)
                               throws InterruptedException
        指定されたタスクを実行し、すべてが完了するか時間切れになるか、そのいずれかが最初に発生した時点で、ステータスと結果を含むFutureのリストを返します。 返されるリストの各要素に対してFuture.isDone()trueになります。 返された時点で、完了していないタスクは取り消されます。 完了したタスクは、通常どおりか例外をスローすることで終了しています。 オペレーションの進行中に、指定されたコレクションが変更された場合、このメソッドの結果は定義されていません。
        型パラメータ:
        T - タスクから返される値の型
        パラメータ:
        tasks - タスクのコレクション
        timeout - 待機する最長時間
        unit - timeout引数の時間単位
        戻り値:
        タスクを表すFutureのリスト。リストの順序は、指定されたタスク・リストのイテレータにより生成される順序と同じになります。 オペレーションがタイム・アウトにならなかった場合、各タスクは完了します。 オペレーションがタイム・アウトになった場合、タスクの一部は完了しません。
        例外:
        InterruptedException - 待機中に割込みが発生した場合。この場合、未完了のタスクは取り消されます
        NullPointerException - タスク、その要素のいずれか、または単位がnullの場合
        RejectedExecutionException - いずれかのタスクの実行をスケジュールできない場合
      • invokeAny

        <T> T invokeAny​(Collection<? extends Callable<T>> tasks)
                 throws InterruptedException,
                        ExecutionException
        指定されたタスクを実行し、例外をスローせずに正常に完了したタスクが存在する場合は、その結果を返します。 正常に戻った時点、または例外が返された時点で、完了していないタスクは取り消されます。 オペレーションの進行中に、指定されたコレクションが変更された場合、このメソッドの結果は定義されていません。
        型パラメータ:
        T - タスクから返される値の型
        パラメータ:
        tasks - タスクのコレクション
        戻り値:
        タスクのいずれかによって返される結果
        例外:
        InterruptedException - 待機中に割込みが発生した場合
        NullPointerException - タスクまたは実行に従ういずれかの要素タスクがnullの場合
        IllegalArgumentException - タスクが空の場合
        ExecutionException - 正常に完了したタスクがない場合
        RejectedExecutionException - タスクの実行をスケジュールできない場合
      • invokeAny

        <T> T invokeAny​(Collection<? extends Callable<T>> tasks,
                        long timeout,
                        TimeUnit unit)
                 throws InterruptedException,
                        ExecutionException,
                        TimeoutException
        指定されたタスクを実行し、タイム・アウトが経過する前に例外をスローせずに正常に完了したタスクが存在する場合は、その結果を返します。 正常に戻った時点、または例外が返された時点で、完了していないタスクは取り消されます。 オペレーションの進行中に、指定されたコレクションが変更された場合、このメソッドの結果は定義されていません。
        型パラメータ:
        T - タスクから返される値の型
        パラメータ:
        tasks - タスクのコレクション
        timeout - 待機する最長時間
        unit - timeout引数の時間単位
        戻り値:
        タスクのいずれかによって返される結果
        例外:
        InterruptedException - 待機中に割込みが発生した場合
        NullPointerException - タスク、単位、または実行に従ういずれかの要素タスクがnullの場合
        TimeoutException - タスクが正常に完了する前に、指定されたタイム・アウトが経過した場合
        ExecutionException - 正常に完了したタスクがない場合
        RejectedExecutionException - タスクの実行をスケジュールできない場合