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


簡単ですが以上になります。

[ 環境情報 ]
Windows 7 SP1
Java SE 8 Update 74