java.util.concurrentが便利すぎる

jdk1.5で入ったらしいjava.util.concurrentが非常に便利だ。
Collection系もさることながら、Executor&Callable&Futureの3つで実現される非同期処理が非常に便利だ。今までだとスレッドはRunnableを継承していたので単純な値の返却手段がなかったが、Callableは値を返すことが出来る。またFutureが単純な同期をとってくれる。
非常に単純な使い方としては、まずjava.util.concurrent.Executorsで適当なExecutorServiceを作る。次に非同期に処理させたいものをsubmitでキューに追加する。そしてFuture.get()で結果を受け取る。Future.get()はまだ処理中なら自動的にwait()するので特に他に同期機構はいらない。またキューに入れられた処理がどういった順で処理されるのかはExecutorServiceによる。

適当なサンプル;

import java.util.concurrent.ExecutionException;
import java.util.concurrent.Executors;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Future;
import java.util.concurrent.Callable;

public class Test{
	public Test(int max){
		ExecutorService e = Executors.newFixedThreadPool(3);
		Future<Integer>[] flist=new Future<Integer>[3];
		flist[0]=e.submit(new Sumtask(0,max/3));
		flist[1]=e.submit(new Sumtask(max/3+1,max*2/3));
		flist[2]=e.submit(new Sumtask(max*2/3+1,max));
		int ret=0;
		for(Future f:flist){
			ret+=f.get().intValue();
		}
		e.shutdown()
	}
	class SumTask implements Callable<Integer>{
		int min,max;
		public SumTask(int min_,int max_){
			min=min_;
			max=max_;
		}
		public Integer call(){
			int ret=0;
			for(int i=min;i<=max;i++){
				ret+=i;
			}
			return Integer.valueOf(i);
		}
	}
	public static void main(String[] args) {
		new Test(1000);
	}
}