ExecutorService#submit を使ったサンプル
ExecutorService#submit を使ったサンプルのメモです。
Executor#execute でもタスクの実行はできますが、ExecutorService#submit を使うとタスクの結果 ( Future ) が得られるという感じですかね。
実際のサンプルの以下の感じです。
■ ExecutorExample.java
package com.example.executor; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; public class ExecutorExample { private static ExecutorService es = Executors.newFixedThreadPool(10); private static List<Future<BeanExample>> futureList = new ArrayList<>(); public static void main(String[] args) { for (int i = 1; i <= 5; i++) { futureList.add(es.submit(new CallableImplExample(i, "test" + i))); } for (Future<BeanExample> f : futureList) { try { BeanExample bean = f.get(); System.out.println(bean.getId() + ":" + bean.getName()); } catch (ExecutionException | InterruptedException e) { System.err.println("Exception occur !!"); } } } }
■ CallableImplExample.java
package com.example.executor; import java.util.concurrent.Callable; public class CallableImplExample implements Callable<BeanExample> { private int id; private String name; public CallableImplExample(int id, String name) { this.id = id; this.name = name; } @Override public BeanExample call() throws Exception { BeanExample bean = new BeanExample(); bean.setId(id); bean.setName(name); return bean; } }
■ BeanExample.java
package com.example.executor; public class BeanExample { private int id; private String name; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
■ 実行結果
1:test1 2:test2 3:test3 4:test4 5:test5
submit の引数には Callable と Runnable がありますが、今回は Callable の方 ( Callable インタフェースの実装クラス CallableImplExample ) を使ってます。API ドキュメントの記述から Callable を使うを例外のスローができる、って感じですかね。たぶん・・・
・Callable (Java Platform SE 8 )
https://docs.oracle.com/javase/jp/8/docs/api/java/util/concurrent/Callable.html
簡単ですが以上になります。