Java ExecutorServiceの例
Javaでは、
ExecutorService`を使用してスレッドプールを作成し、
Future`を使用して非同期タスクの進行状況を追跡できます。
ExecutorService`は
Runnable`と `Callable`タスクの両方を受け入れます。
-
Runnable – 何も返さない.
-
呼び出し可能 – 将来を返す
1. ExecutorService
1.1 5つのスレッドを持つスレッドプールを作成し、2つのタスクを実行し、
Future`から結果を取得し、例外を処理する古典的な
ExecutorService`の例です。
ExecutorExample1.java
package com.mkyong.concurrency.executor; import java.util.concurrent.** ; public class ExecutorExample1 { public static void main(String[]args) { ExecutorService executor = Executors.newFixedThreadPool(5); //Runnable, return void, nothing, submit and run the task async executor.submit(() -> System.out.println("I'm Runnable task.")); //Callable, return a future, submit and run the task async Future<Integer> futureTask1 = executor.submit(() -> { System.out.println("I'm Callable task."); return 1 + 1; }); /** Before Java 8 executor.submit(new Runnable() { @Override public void run() { System.out.println("I'm Runnable task."); } }); Future<Integer> futureTask1 = executor.submit(new Callable<Integer>() { @Override public Integer call() { System.out.println("I'm Callable task."); return 1 + 1; } });** / try { otherTask("Before Future Result"); //block until future returned a result, //timeout if the future takes more than 5 seconds to return the result Integer result = futureTask1.get(5, TimeUnit.SECONDS); System.out.println("Get future result : " + result); otherTask("After Future Result"); } catch (InterruptedException e) {//thread was interrupted e.printStackTrace(); } catch (ExecutionException e) {//thread threw an exception e.printStackTrace(); } catch (TimeoutException e) {//timeout before the future task is complete e.printStackTrace(); } finally { //shut down the executor manually executor.shutdown(); } } private static void otherTask(String name) { System.out.println("I'm other task! " + name); } }
出力
I'm Runnable task. I'm Callable task. I'm other task! Before Future Result Get future result : 2 I'm other task! After Future Result
2. invokeAll
2.1
Callable`タスクのリストを作成し、
invokeAll`を使ってそれらをすべて実行することもできます
ExecutorExample2.java
package com.mkyong.concurrency.executor; import java.util.Arrays; import java.util.List; import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; public class ExecutorExample2 { public static void main(String[]args) { ExecutorService executor = Executors.newCachedThreadPool(); List<Callable<Integer>> listOfCallable = Arrays.asList( () -> 1, () -> 2, () -> 3); try { List<Future<Integer>> futures = executor.invokeAll(listOfCallable); int sum = futures.stream().map(f -> { try { return f.get(); } catch (Exception e) { throw new IllegalStateException(e); } }).mapToInt(Integer::intValue).sum(); System.out.println(sum); } catch (InterruptedException e) {//thread was interrupted e.printStackTrace(); } finally { //shut down the executor manually executor.shutdown(); } } }
出力
6
ソースコードをダウンロードする
$ git clone
https://github.com/mkyong/java-concurrency.git