インタフェースExecutorService
- すべてのスーパー・インタフェース:
AutoCloseable,Executor
- 既知のすべてのサブインタフェース:
ScheduledExecutorService
- 既知のすべての実装クラス:
AbstractExecutorService,ForkJoinPool,ScheduledThreadPoolExecutor,ThreadPoolExecutor
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
-
メソッドのサマリー
修飾子と型メソッド説明booleanawaitTermination(long timeout, TimeUnit unit) シャットダウン要求後にすべてのタスクが実行を完了していたか、タイム・アウトが発生するか、現在のスレッドで割込みが発生するか、そのいずれかが最初に発生するまでブロックします。default voidclose()順序正しくシャットダウンを開始します。以前に送信されたタスクが実行されますが、新規タスクは受け入れられません。invokeAll(Collection<? extends Callable<T>> tasks) 指定されたタスクを実行し、すべて完了すると、ステータスと結果を含むFutureのリストを返します。invokeAll(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit) 指定されたタスクを実行し、すべてが完了するか時間切れになるか、そのいずれかが最初に発生した時点で、ステータスと結果を含むFutureのリストを返します。<T> TinvokeAny(Collection<? extends Callable<T>> tasks) 指定されたタスクを実行し、例外をスローせずに正常に完了したタスクが存在する場合は、その結果を返します。<T> TinvokeAny(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit) 指定されたタスクを実行し、タイム・アウトが経過する前に例外をスローせずに正常に完了したタスクが存在する場合は、その結果を返します。booleanこのexecutorがシャットダウンしていた場合、trueを返します。booleanシャットダウンに続いてすべてのタスクが完了していた場合、trueを返します。voidshutdown()順序正しくシャットダウンを開始します。以前に送信されたタスクが実行されますが、新規タスクは受け入れられません。実行中のアクティブなタスクすべての停止を試み、待機中のタスクの処理を停止し、実行を待機していたタスクのリストを返します。Future<?> 実行用のRunnableタスクを送信し、そのタスクを表すFutureを返します。<T> Future<T> 実行用のRunnableタスクを送信し、そのタスクを表すFutureを返します。<T> Future<T> 値を返す実行用タスクを送信して、保留状態のタスク結果を表すFutureを返します。
-
メソッドの詳細
-
shutdown
void shutdown()順序正しくシャットダウンを開始します。以前に送信されたタスクが実行されますが、新規タスクは受け入れられません。 シャットダウン後に呼出しを実行しても、効果はありません。このメソッドは、以前に送信されたタスクが実行を完了するのを待機しません。 これを実行するには、
awaitTerminationを使ってください。 -
shutdownNow
実行中のアクティブなタスクすべての停止を試み、待機中のタスクの処理を停止し、実行を待機していたタスクのリストを返します。このメソッドは、アクティブに実行中のタスクが終了するのを待機しません。 これを実行するには、
awaitTerminationを使ってください。実行中のアクティブなタスク処理を停止するために最善の努力をすること以上の保証はありません。 たとえば、標準的な実装では
Thread.interrupt()を使用して取り消すため、割り込みに応答できなかったタスクがすべて終了しなくなる可能性があります。- 戻り値:
- 実行が開始されなかったタスクのリスト
-
isShutdown
boolean isShutdown()このexecutorがシャットダウンしていた場合、trueを返します。- 戻り値:
- このexecutorがシャットダウンしていた場合は
true
-
isTerminated
boolean isTerminated()シャットダウンに続いてすべてのタスクが完了していた場合、trueを返します。shutdownまたはshutdownNowのいずれかが最初に呼び出された場合を除き、isTerminatedがtrueになることはありません。- 戻り値:
- シャットダウンに続いてすべてのタスクが完了していた場合は
true
-
awaitTermination
boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException シャットダウン要求後にすべてのタスクが実行を完了していたか、タイム・アウトが発生するか、現在のスレッドで割込みが発生するか、そのいずれかが最初に発生するまでブロックします。- パラメータ:
timeout- 待機する最長時間unit- timeout引数の時間単位- 戻り値:
- このexecutorが終了した場合は
true、終了前にタイム・アウトが経過した場合はfalse - スロー:
InterruptedException- 待機中に割込みが発生した場合
-
submit
値を返す実行用タスクを送信して、保留状態のタスク結果を表すFutureを返します。 Futureのgetメソッドは、正常に完了した時点でタスクの結果を返します。タスクの待機をただちにブロックする場合は、
result = exec.submit(aCallable).get();の形式の構築を使用できます。ノート:
Executorsクラスには、クロージャに似たほかの一般オブジェクトを変換できるメソッド・セットが含まれます。たとえば、PrivilegedActionをCallable形式に変換して、送信可能にすることができます。- 型パラメータ:
T- タスクの結果のタイプ- パラメータ:
task- 送信するタスク- 戻り値:
- タスクの保留完了を表すFuture
- スロー:
RejectedExecutionException- タスクの実行をスケジュールできない場合NullPointerException- タスクがnullの場合
-
submit
実行用のRunnableタスクを送信し、そのタスクを表すFutureを返します。 Futureのgetメソッドは、正常に完了した時点で指定された結果を返します。- 型パラメータ:
T- 結果のタイプ- パラメータ:
task- 送信するタスクresult- 返す結果- 戻り値:
- タスクの保留完了を表すFuture
- スロー:
RejectedExecutionException- タスクの実行をスケジュールできない場合NullPointerException- タスクがnullの場合
-
submit
実行用の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- タスクの実行をスケジュールできない場合
-
close
default void close()順序正しくシャットダウンを開始します。以前に送信されたタスクが実行されますが、新規タスクは受け入れられません。 このメソッドは、すべてのタスクの実行が完了し、エグゼキュータが終了するまで待機します。待機中に中断された場合、このメソッドは、
shutdownNow()を呼び出した場合と同様に、すべての実行タスクを停止します。 その後、アクティブに実行されているすべてのタスクが完了するまで待機し続けます。 実行を待機していたタスクは実行されません。 割り込みステータスは、このメソッドが戻る前に再アサートされます。すでに終了している場合は、このメソッドを呼び出しても効果はありません。
- 定義:
close、インタフェースAutoCloseable- 実装要件:
- デフォルトの実装では、
shutdown()が起動され、タスクがawaitTerminationを使用して実行を完了するまで待機します。 - 導入されたバージョン:
- 19
-