public interface ExecutorService extends Executor
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()
によって結果が取得される前に発生します。
修飾子と型 | メソッドと説明 |
---|---|
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を返します。
|
void shutdown()
このメソッドは、以前に送信されたタスクが実行を完了するのを待機しません。これを実行するには、awaitTermination
を使ってください。
SecurityException
- セキュリティ・マネージャが存在する状況でこのExecutorServiceのシャットダウンを実行すると、呼出し側には変更を許可しないスレッドを操作できる場合。これは、RuntimePermission
("modifyThread")
を保持しないか、セキュリティ・マネージャのcheckAccess
メソッドがアクセスを拒否するためである。List<Runnable> shutdownNow()
このメソッドは、アクティブに実行中のタスクが終了するのを待機しません。これを実行するには、awaitTermination
を使ってください。
実行中のアクティブなタスク処理を停止するために最善の努力をすること以上の保証はありません。たとえば、標準的な実装ではThread.interrupt()
を使用して取り消すため、割り込みに応答できなかったタスクがすべて終了しなくなる可能性があります。
SecurityException
- セキュリティ・マネージャが存在する状況でこのExecutorServiceのシャットダウンを実行すると、呼出し側には変更を許可しないスレッドを操作できる場合。これは、RuntimePermission
("modifyThread")
を保持しないか、セキュリティ・マネージャのcheckAccess
メソッドがアクセスを拒否するためである。boolean isShutdown()
true
を返します。true
boolean isTerminated()
true
を返します。shutdown
またはshutdownNow
のいずれかが最初に呼び出された場合を除き、isTerminated
がtrue
になることはありません。true
boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException
timeout
- 待機する最長時間unit
- timeout引数の時間単位true
、終了前にタイム・アウトが経過した場合はfalse
InterruptedException
- 待機中に割込みが発生した場合<T> Future<T> submit(Callable<T> task)
get
メソッドは、正常に完了した時点でタスクの結果を返します。
タスクの待機をただちにブロックする場合は、result = exec.submit(aCallable).get();
の形式の構築を使用できます。
注: Executors
クラスには、クロージャに似たほかの一般オブジェクトを変換できるメソッド・セットが含まれます。たとえば、PrivilegedAction
をCallable
形式に変換して、送信可能にすることができます。
T
- タスクの結果の型task
- 送信するタスクRejectedExecutionException
- タスクの実行をスケジュールできない場合NullPointerException
- タスクがnullの場合<T> Future<T> submit(Runnable task, T result)
get
メソッドは、正常に完了した時点で指定された結果を返します。T
- 結果の型task
- 送信するタスクresult
- 返す結果RejectedExecutionException
- タスクの実行をスケジュールできない場合NullPointerException
- タスクがnullの場合Future<?> submit(Runnable task)
get
メソッドは、正常に
完了した時点でnullを返します。task
- 送信するタスクRejectedExecutionException
- タスクの実行をスケジュールできない場合NullPointerException
- タスクがnullの場合<T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks) throws InterruptedException
Future.isDone()
はtrue
になります。完了したタスクは、通常どおりか例外をスローすることで終了しています。オペレーションの進行中に、指定されたコレクションが変更された場合、このメソッドの結果は定義されていません。T
- タスクから返される値の型tasks
- タスクのコレクションInterruptedException
- 待機中に割込みが発生した場合。この場合、未完了のタスクは取り消されますNullPointerException
- タスクまたはそのいずれかの要素がnull
の場合RejectedExecutionException
- いずれかのタスクの実行をスケジュールできない場合<T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit) throws InterruptedException
Future.isDone()
はtrue
になります。返された時点で、完了していないタスクは取り消されます。完了したタスクは、通常どおりか例外をスローすることで終了しています。オペレーションの進行中に、指定されたコレクションが変更された場合、このメソッドの結果は定義されていません。T
- タスクから返される値の型tasks
- タスクのコレクションtimeout
- 待機する最長時間unit
- timeout引数の時間単位InterruptedException
- 待機中に割込みが発生した場合。この場合、未完了のタスクは取り消されますNullPointerException
- タスク、その要素のいずれか、または単位がnull
の場合RejectedExecutionException
- いずれかのタスクの実行をスケジュールできない場合<T> T invokeAny(Collection<? extends Callable<T>> tasks) throws InterruptedException, ExecutionException
T
- タスクから返される値の型tasks
- タスクのコレクションInterruptedException
- 待機中に割込みが発生した場合NullPointerException
- タスクまたは実行に従ういずれかの要素タスクがnull
の場合IllegalArgumentException
- タスクが空の場合ExecutionException
- 正常に完了したタスクがない場合RejectedExecutionException
- タスクの実行をスケジュールできない場合<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
- タスクの実行をスケジュールできない場合 バグまたは機能を送信
詳細なAPIリファレンスおよび開発者ドキュメントについては、Java SEのドキュメントを参照してください。そのドキュメントには、概念的な概要、用語の定義、回避方法、有効なコード例などの、開発者を対象にしたより詳細な説明が含まれています。
Copyright© 1993, 2014, Oracle and/or its affiliates. All rights reserved.