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); } }