java.util.concurrent.ExecutorService
というJava ExecutorServiceインターフェイスは、バックグラウンドでタスクを同時に実行することができる非同期実行メカニズムを表しています。 このJavaのExecutorService
ExecutorService
ExecutorService
を再びシャットダウンする方法を説明します。
Java ExecutorService ビデオチュートリアル
ビデオをご覧になりたい方は、こちらのビデオで紹介しています。
Task Delegation
ここでは、スレッドがタスクをJavaのExecutorService
に委ねて非同期に実行する様子を説明しています。
A thread delegating a task to an ExecutorService for asynchronous execution.
スレッドがExecutorService
にタスクを委譲すると、スレッドはそのタスクの実行とは無関係に自分の実行を続けます。
Java ExecutorServiceの例
ExecutorService
を深く理解する前に、簡単な例を見てみましょう。
ExecutorService
の例を示します。
ExecutorService executorService = Executors.newFixedThreadPool(10);executorService.execute(new Runnable() { public void run() { System.out.println("Asynchronous task"); }});executorService.shutdown();
まず ExecutorService
Executors
newFixedThreadPool()
ファクトリー メソッドを使用して作成されます。
次に、Runnable
execute()
メソッドに渡します。
このチュートリアルでは、ExecutorService
Runnable
が実行されます。
Java ExecutorService の実装
Java の ExecutorService
java.util.concurrent
ExecutorService
インターフェースの実装は、スレッドプールの実装です。
ExecutorService
ExecutorService
java.util.concurrent
パッケージに以下のような実装があります。
- ThreadPoolExecutor
- ScheduledThreadPoolExecutor
Creating an ExecutorService
ExecutorService
Executors
ExecutorService
のインスタンスを作成することもできます。
ExecutorService
を作成する例をいくつか挙げてみましょう。
- execute(Runnable)
- submit(Runnable)
- submit(Callable)
- invokeAny(…….)
- invokeAll(…)
以下のセクションで、これらのメソッドをそれぞれ見ていきます。
Execute Runnable
JavaのExecutorService
execute(Runnable)
java.lang.Runnable
Runnable
ExecutorService
で実行する例です:
ExecutorService executorService = Executors.newSingleThreadExecutor();executorService.execute(new Runnable() { public void run() { System.out.println("Asynchronous task"); }});executorService.shutdown();
必要に応じて、実行されたRunnable
Callable
を使用する必要があります(次のセクションで説明します)。
Submit Runnable
Java の ExecutorService
submit(Runnable)
Runnable
Future
Future
Runnable
の実行が終了したかどうかを確認するために使用できます。
以下は、JavaのExecutorService
submit()
の例です。
Future future = executorService.submit(new Runnable() { public void run() { System.out.println("Asynchronous task"); }});future.get(); //returns null if the task has finished correctly.
submit()
Runnable
がいつ完了したのかを確認するために使用できるJava Futureオブジェクトを返します。
Callableの送信
JavaのExecutorService
submit(Callable)
submit(Runnable)
Runnable
の代わりにJava Callableを取る点が異なります。
Callable
Runnable
の正確な違いは、後で少し説明します。
Callable
submit(Callable)
メソッドによって返される Java Future オブジェクトを介して取得できます。 ExecutorService
Callable
の例を示します。
Future future = executorService.submit(new Callable(){ public Object call() throws Exception { System.out.println("Asynchronous Callable"); return "Callable Result"; }});System.out.println("future.get() = " + future.get());
上記のコード例では次のように出力されます。
Asynchronous Callablefuture.get() = Callable Result
invokeAny()
invokeAny()
Callable
Callable
Future
Callable
Callable
のどの結果が返ってくるかは保証されません。
invokeAny()
から結果が返されるように、1 つの Callable が終了すると、残りの Callable インスタンスはキャンセルされます。
タスクの 1 つが完了する (または例外を投げる) と、残りの Callable
はキャンセルされます。
以下にコード例を示します。
ExecutorService executorService = Executors.newSingleThreadExecutor();Set<Callable<String>> callables = new HashSet<Callable<String>>();callables.add(new Callable<String>() { public String call() throws Exception { return "Task 1"; }});callables.add(new Callable<String>() { public String call() throws Exception { return "Task 2"; }});callables.add(new Callable<String>() { public String call() throws Exception { return "Task 3"; }});String result = executorService.invokeAny(callables);System.out.println("result = " + result);executorService.shutdown();
このコード例は、与えられたコレクション内の Callable
の 1 つが返すオブジェクトを出力します。 何度か実行してみましたが、結果は変わります。
invokeAll()
invokeAll()
Callable
invokeAll()
Future
Callable
Future
では、その違いを見分けることはできません。
以下にコード例を示します。 Callable
Runnable
Callable
インターフェースと非常によく似ています。 Runnableインターフェースは、スレッドやExecutorService
が同時に実行できるタスクを表します。 CallableはExecutorServiceによってのみ実行されます。 どちらのインターフェースも単一のメソッドしか持ちません。 しかし、Callable
Runnable
Runnable
Callable
のインターフェイスの違いは、インターフェイスの宣言を見るとよりわかりやすくなります。
ここではまず、Runnable
のインターフェイス宣言を紹介します:
public interface Runnable { public void run();}
そして、Callable
のインターフェイス宣言を紹介します。
public interface Callable{ public Object call() throws Exception;}
Runnable
run()
Callable
call()
call()
Object
call()
run()
call()
run()
RuntimeException
のサブクラスは除く)。
Java の ExecutorService
Callable
Runnable
インターフェースを実装すればよいのです。
タスクのキャンセル
Javaの
Runnable
Callable
)をキャンセルすることができます。ExecutorService
に送信されたタスクは、タスクが送信されたときに返されたFuture
cancel()
メソッドを呼び出すことでキャンセルすることができます。 タスクのキャンセルは、タスクがまだ実行を開始していない場合にのみ可能です。
future.cancel();
ExecutorServiceのシャットダウン
JavaのExecutorService
main()
ExexutorService
があれば、アプリケーションは動き続けます。
shutdown()
ExecutorService
shutdown()
ExecutorService
ExecutorService
shutdown()
ExecutorService
に提出されたすべてのタスクが実行されます。 ここでは、JavaのExecutorService
のシャットダウンを実行する例を示します。
executorService.shutdown();
shutdownNow()
ExecutorService
shutdownNow()
ExecutorService
shutdownNow
を呼び出した例です。
executorService.shutdownNow();
awaitTermination()
ExecutorService
awaitTermination()
ExecutorService
awaitTermination()
shutdown()
shutdownNow()
ExecutorService
awaitTermination()
を呼び出した例です:
executorService.shutdown();executorService.awaitTermination(10_000L, TimeUnit.MILLISECONDS );
。