java.util.concurrent.ExecutorServiceというJava ExecutorServiceインターフェイスは、バックグラウンドでタスクを同時に実行することができる非同期実行メカニズムを表しています。 このJavaのExecutorServiceExecutorServiceExecutorServiceを再びシャットダウンする方法を説明します。
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();
まず ExecutorServiceExecutorsnewFixedThreadPool() ファクトリー メソッドを使用して作成されます。
次に、Runnableexecute() メソッドに渡します。
このチュートリアルでは、ExecutorServiceRunnable が実行されます。
Java ExecutorService の実装
Java の ExecutorServicejava.util.concurrentExecutorServiceインターフェースの実装は、スレッドプールの実装です。
ExecutorServiceExecutorServicejava.util.concurrentパッケージに以下のような実装があります。
- ThreadPoolExecutor
- ScheduledThreadPoolExecutor
Creating an ExecutorService
ExecutorServiceExecutorsExecutorServiceのインスタンスを作成することもできます。
ExecutorServiceを作成する例をいくつか挙げてみましょう。
- execute(Runnable)
- submit(Runnable)
- submit(Callable)
- invokeAny(…….)
- invokeAll(…)
以下のセクションで、これらのメソッドをそれぞれ見ていきます。
Execute Runnable
JavaのExecutorServiceexecute(Runnable)java.lang.RunnableRunnableExecutorServiceで実行する例です:
ExecutorService executorService = Executors.newSingleThreadExecutor();executorService.execute(new Runnable() { public void run() { System.out.println("Asynchronous task"); }});executorService.shutdown();
必要に応じて、実行されたRunnableCallableを使用する必要があります(次のセクションで説明します)。
Submit Runnable
Java の ExecutorServicesubmit(Runnable)RunnableFutureFutureRunnableの実行が終了したかどうかを確認するために使用できます。
以下は、JavaのExecutorServicesubmit()の例です。
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のExecutorServicesubmit(Callable)submit(Runnable)Runnableの代わりにJava Callableを取る点が異なります。
CallableRunnable の正確な違いは、後で少し説明します。
Callablesubmit(Callable) メソッドによって返される Java Future オブジェクトを介して取得できます。 ExecutorServiceCallable の例を示します。
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()CallableCallableFutureCallableCallableのどの結果が返ってくるかは保証されません。
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()CallableinvokeAll()FutureCallableFutureでは、その違いを見分けることはできません。
以下にコード例を示します。 Callable
RunnableCallable インターフェースと非常によく似ています。 Runnableインターフェースは、スレッドやExecutorServiceが同時に実行できるタスクを表します。 CallableはExecutorServiceによってのみ実行されます。 どちらのインターフェースも単一のメソッドしか持ちません。 しかし、CallableRunnableRunnableCallableのインターフェイスの違いは、インターフェイスの宣言を見るとよりわかりやすくなります。
ここではまず、Runnableのインターフェイス宣言を紹介します:
public interface Runnable { public void run();}
そして、Callableのインターフェイス宣言を紹介します。
public interface Callable{ public Object call() throws Exception;}
Runnablerun()Callablecall()call()Objectcall()run()call()run()RuntimeExceptionのサブクラスは除く)。
Java の ExecutorServiceCallableRunnable インターフェースを実装すればよいのです。
タスクのキャンセル
Javaの
RunnableCallable)をキャンセルすることができます。ExecutorServiceに送信されたタスクは、タスクが送信されたときに返されたFuturecancel()メソッドを呼び出すことでキャンセルすることができます。 タスクのキャンセルは、タスクがまだ実行を開始していない場合にのみ可能です。
future.cancel();
ExecutorServiceのシャットダウン
JavaのExecutorServicemain()ExexutorServiceがあれば、アプリケーションは動き続けます。
shutdown()
ExecutorServiceshutdown()ExecutorServiceExecutorServiceshutdown()ExecutorServiceに提出されたすべてのタスクが実行されます。 ここでは、JavaのExecutorServiceのシャットダウンを実行する例を示します。
executorService.shutdown();
shutdownNow()
ExecutorServiceshutdownNow()ExecutorServiceshutdownNowを呼び出した例です。
executorService.shutdownNow();
awaitTermination()
ExecutorServiceawaitTermination()ExecutorServiceawaitTermination()shutdown()shutdownNow()ExecutorServiceawaitTermination()を呼び出した例です:
executorService.shutdown();executorService.awaitTermination(10_000L, TimeUnit.MILLISECONDS );
。