JavaTM Platform
Standard Ed. 6

java.util.concurrent
インタフェース ExecutorService

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

public interface ExecutorService
extends Executor

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

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

submit メソッドは、実行の取り消しや完了の待機に使用できる Future を作成して返すことにより、基底メソッド Executor.execute(java.lang.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 に送信する前のスレッド内のアクションは、そのタスクによって行われるアクションよりも happen-before であり、一方それは、Future.get() によって取得される結果よりも happen-before です。

導入されたバージョン:
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()
          実行中のアクティブなタスクすべての停止を試み、待機中のタスクの処理を停止し、実行を待機していたタスクのリストを返します。
<T> Future<T>
submit(Callable<T> task)
          値を返す実行用タスクを送信して、保留状態のタスク結果を表す Future を返します。
 Future<?> submit(Runnable task)
          実行用の Runnable タスクを送信し、そのタスクを表す Future を返します。
<T> Future<T>
submit(Runnable task, T result)
          実行用の Runnable タスクを送信し、そのタスクを表す Future を返します。
 
インタフェース java.util.concurrent.Executor から継承されたメソッド
execute
 

メソッドの詳細

shutdown

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

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

shutdownNow

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

実行中のアクティブなタスク処理を停止するために最善の努力をすること以上の保証はありません。たとえば、通常の実装では Thread.interrupt() を介して取り消しが行われるため、タスクが割り込みに対する応答に失敗すると、タスクが終了しなくなる可能性があります。

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

isShutdown

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

戻り値:
この executor がシャットダウンしていた場合は true

isTerminated

boolean isTerminated()
シャットダウンに続いてすべてのタスクが完了していた場合、true を返します。shutdown または shutdownNow のいずれかが isTerminated の前に呼び出された場合を除き、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 形式に変換して、送信可能にすることができます。

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

submit

<T> Future<T> submit(Runnable task,
                     T result)
実行用の Runnable タスクを送信し、そのタスクを表す Future を返します。Future の get メソッドは、正常に完了した時点で指定された結果を返します。

パラメータ:
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 になります。「完了した」タスクは、通常どおりか例外をスローすることで終了しています。オペレーションの進行中に、指定されたコレクションが変更された場合、このメソッドの結果は定義されていません。

パラメータ:
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 になります。返された時点で、完了していないタスクは取り消されます。「完了した」タスクは、通常どおりか例外をスローすることで終了しています。オペレーションの進行中に、指定されたコレクションが変更された場合、このメソッドの結果は定義されていません。

パラメータ:
tasks - タスクのコレクション
timeout - 待機する最長時間
unit - timeout 引数の時間単位
戻り値:
タスクを表す Future のリスト。リストの順序は、指定されたタスクリストの反復子により生成される順序と同じになる。オペレーションがタイムアウトにならなかった場合、各タスクは完了する。オペレーションがタイムアウトになった場合、タスクの一部は完了しない。
例外:
InterruptedException - 待機中に割り込みが発生した場合。この場合、未完了のタスクは取り消される
NullPointerException - タスク、その要素のいずれか、または単位が null の場合
RejectedExecutionException - いずれかのタスクの実行をスケジュールできない場合

invokeAny

<T> T invokeAny(Collection<? extends Callable<T>> tasks)
            throws InterruptedException,
                   ExecutionException
指定されたタスクを実行し、例外をスローせずに正常に完了したタスクが存在する場合は、その結果を返します。正常に戻った時点、または例外が返された時点で、完了していないタスクは取り消されます。オペレーションの進行中に、指定されたコレクションが変更された場合、このメソッドの結果は定義されていません。

パラメータ:
tasks - タスクのコレクション
戻り値:
タスクのいずれかによって返される結果
例外:
InterruptedException - 待機中に割り込みが発生した場合
NullPointerException - タスクまたはそのいずれかの要素が null の場合
IllegalArgumentException - タスクが空の場合
ExecutionException - 正常に完了したタスクがない場合
RejectedExecutionException - タスクの実行をスケジュールできない場合

invokeAny

<T> T invokeAny(Collection<? extends Callable<T>> tasks,
                long timeout,
                TimeUnit unit)
            throws InterruptedException,
                   ExecutionException,
                   TimeoutException
指定されたタスクを実行し、タイムアウトが経過する前に例外をスローせずに正常に完了したタスクが存在する場合は、その結果を返します。正常に戻った時点、または例外が返された時点で、完了していないタスクは取り消されます。オペレーションの進行中に、指定されたコレクションが変更された場合、このメソッドの結果は定義されていません。

パラメータ:
tasks - タスクのコレクション
timeout - 待機する最長時間
unit - timeout 引数の時間単位
戻り値:
タスクのいずれかによって返される結果。
例外:
InterruptedException - 待機中に割り込みが発生した場合
NullPointerException - タスク、その要素のいずれか、または単位が null の場合
TimeoutException - タスクが正常に完了する前に、指定されたタイムアウトが経過した場合
ExecutionException - 正常に完了したタスクがない場合
RejectedExecutionException - タスクの実行をスケジュールできない場合

JavaTM Platform
Standard Ed. 6

バグの報告と機能のリクエスト
さらに詳しい API リファレンスおよび開発者ドキュメントについては、Java SE 開発者用ドキュメントを参照してください。開発者向けの詳細な解説、概念の概要、用語の定義、バグの回避策、およびコード実例が含まれています。

Copyright 2006 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms. Documentation Redistribution Policy も参照してください。