Java ExecutorService は、スレッド上でタスクを非同期に実行できるようにするインターフェイスです。 Java ExecutorService インターフェースは、java.util.concurrent パッケージに存在します。 ExecutorService は、スレッドのプールを維持し、スレッドにタスクを割り当てるのに役立ちます。また、タスクの数が使用可能なスレッドよりも多い場合に、使用可能な空きスレッドができるまでタスクをキューに入れる機能も提供します。
Java ExecutorService のメソッド
方法 | 説明 |
---|---|
boolean awaitTermination(長いタイムアウト、TimeUnit単位) | このメソッドは、シャットダウン要求後にすべてのタスクが完了するか、指定されたタイムアウトが発生するか、現在のスレッドが中断されるか、いずれか先に起こるまで、タスクが ExecutorService に入るのをブロックします。 |
リスト | このメソッドは、指定されたタスクのリストを実行し、完了時にすべてのタスクの結果を含む Future のリストを返します。 |
リスト | このメソッドは、指定されたタスクのリストを実行し、完了またはタイムアウトのいずれかが早い方の時点で、すべてのタスクの結果を含む Future のリストを返します。 |
T invokeAny(コレクション extends Callable>タスク) | このメソッドは、指定されたタスクのリストを実行し、例外をスローせずに完了した 1 つのタスクの結果を返します。 |
T invokeAny(コレクション extends Callable>タスク、長いタイムアウト、TimeUnit 単位) | このメソッドは、指定されたタスクのリストを実行し、タイムアウトが経過する前に例外をスローせずに完了した 1 つのタスクの結果を返します。 |
ブール値 isShutdown() | このメソッドは、指定されたエグゼキュータがシャットダウンされているかどうかを返します。 |
ブール値 isTerminated() | シャットダウン後にすべてのタスクが実行された場合、このメソッドは true を返します。 |
void シャットダウン() | このメソッドでは、以前に ExecutorService に送信されたタスクの完了が許可されますが、他のタスクの受け入れは許可されません。 |
リスト shutdownNow() | このメソッドは、アクティブに実行中のすべてのタスクを停止し、キューに入れられたタスクの実行を停止し、キューに入れられたタスクのリストを返します。 |
将来の送信(呼び出し可能タスク) | このメソッドは、値を返すタスクを実行のために送信し、タスクの保留中の結果を表す Future を返します。 |
今後の送信(実行可能なタスク) | このメソッドは、実行のためにタスクを送信し、そのタスクを表す Future を返します。正常に完了すると null を返します。 |
今後の送信(実行可能なタスク、T 結果) | このメソッドは、実行のためにタスクを送信し、そのタスクを表す Future を返します。 |
Java ExecutorServiceの簡単なプログラム
public class ExecutorServiceExample { public static void main(String[] args) { ExecutorService executorService = Executors.newFixedThreadPool(10); executorService.execute(new Runnable() { @Override public void run() { System.out.println('ExecutorService'); } }); executorService.shutdown(); } }
出力:
このプログラムでは、10 個のスレッドを持つ ExecutorService を作成し、それに「ExecutorService」を出力するタスクを実行する匿名の実行可能実装を割り当てます。タスクが終了したら、ExecutorService をシャットダウンします。
Java ExecutorService の使用方法
ExecutorService のインスタンス化
Java ExecutorService を使用して、単一のスレッド、スレッドのプール、またはスケジュールされたスレッドのプールを作成できます。 Executors クラスは、次のように ExecutorService をインスタンス化するためのファクトリ メソッドを提供します。
ExecutorService executorService1 = Executors.newSingleThreadExecutor(); //Creates //a ExecutorService object having a single thread. ExecutorService executorService2 = Executors.newFixedThreadPool(10); // Creates a //ExecutorService object having a pool of 10 threads. ExecutorService executorService3 = Executors.newScheduledThreadPool(10); //Creates a scheduled thread pool executor with 10 threads. In scheduled thread //pool, we can schedule tasks of the threads.
ExecutorServices へのタスクの割り当て
タスクを ExecutorService に割り当てるには、次のメソッドを使用できます。
- 実行(実行可能なタスク)
- submit(実行可能なタスク) / submit(呼び出し可能なタスク)
- invokeAny(コレクション extends Callable>タスク)
- invokeAll(コレクション extends Callable>タスク)
execute()メソッドを使用してExecutorServiceにタスクを割り当てる例
データ構造内のハッシュ化
Java ExecutorService のexecute() メソッドは、実行可能オブジェクトを受け取り、そのタスクを非同期に実行します。 execute メソッドの呼び出しを行った後、shutdown メソッドを呼び出します。これにより、他のタスクが executorService のキューに入るのがブロックされます。
public class ExecutorServiceExample { public static void main(String[] args) { ExecutorService executorService = Executors.newSingleThreadExecutor(); executorService.execute(new Runnable() { @Override public void run() { System.out.println('ExecutorService'); } }); executorService.shutdown(); } }
出力:
ExecutorService
submit() を使用して ExecutorService にタスクを割り当てる例
submit() メソッドは実行可能オブジェクトを受け取り、Future オブジェクトを返します。このオブジェクトは、後で Runnable の実行が完了したかどうかを確認するために使用されます。
public class ExecutorServiceExample { public static void main(String[] args) { ExecutorService executorService = Executors.newSingleThreadExecutor(); executorService.submit(new Runnable() { @Override public void run() { System.out.println('ExecutorService'); } }); } }
invokeAny() メソッドを使用して ExecutorService にタスクを割り当てる例
マーキーHTML
invokeAny() メソッドは、Callable オブジェクトのコレクション、または Callable を実装するクラスのオブジェクトを受け取ります。このメソッドは、最初に正常に実行された呼び出し可能オブジェクトの将来のオブジェクトを返します。
public class ExecutorServiceExample { public static void main(String[] args) throws InterruptedException, ExecutionException { ExecutorService executorService = Executors.newSingleThreadExecutor(); Set<callable> callables = new HashSet<callable>(); callables.add(new Callable() { public String call() throws Exception { return 'Task 1'; } }); callables.add(new Callable() { public String call() throws Exception { return 'Task 2'; } }); callables.add(new Callable() { public String call() throws Exception { return 'Task 3'; } }); String result = executorService.invokeAny(callables); System.out.println('result = ' + result); executorService.shutdown(); } } </callable></callable>
出力:
result = Task 1
最初の呼び出し可能オブジェクトが最初に正常に実行されたため、結果にはタスク 1 が格納されます。
invokeAll() メソッドを使用して ExecutorService にタスクを割り当てる例
invokeAll() メソッドは、タスクを含む Callable オブジェクトの Collection を受け取り、すべてのタスクの結果を含む Future オブジェクトのリストを返します。
public class ExecutorServiceExample { public static void main(String[] args) throws InterruptedException, ExecutionException { ExecutorService executorService = Executors.newSingleThreadExecutor(); Set<callable> callables = new HashSet<callable>(); callables.add(new Callable() { public String call() throws Exception { return 'Task 1'; } }); callables.add(new Callable() { public String call() throws Exception { return 'Task 2'; } }); callables.add(new Callable() { public String call() throws Exception { return 'Task 3'; } }); java.util.List<future> futures = executorService.invokeAll(callables); for(Future future : futures){ System.out.println('future.get = ' + future.get()); } executorService.shutdown(); } } </future></callable></callable>
出力:
future.get = Task 1 future.get = Task 3 future.get = Task 2
ExecutorService をシャットダウンする方法
ExecutorService に与えられたタスクが完了したら、ExecutorService は別のスレッドでタスクを実行するため、ExecutorService をシャットダウンする必要があります。 ExecutorService をシャットダウンしないと、スレッドは実行され続け、JVM はシャットダウンされません。
シャットダウンのプロセスは次の 3 つの方法で実行できます。
- shutdown() メソッド
- shutdownNow() メソッド
- awaitTermination() メソッド