RunnableとCallableの使い分け
Java5.0、Tiger以前は、マルチスレッドで処理を行うとき、値を返すスレッドの実装をするのは少々面倒だった。そもそもjava.lang.Runnable#run()
はvoidしか返さない。
というわけで、マルチスレッドで計算を行い、計算結果を簡単に得たい場合はjava.lang.Runnable
を実装するのではなく、java.util.concurrent.Callable
を実装しよう。
Callable
インターフェースを実装するオブジェクトはcall()
メソッドを実装し、返されるオブジェクトが計算結果になるようにしてやれば良い。
class CalculateSomething implements Callable<String> {
public String call() throws Exception {
String rtn = null;
// 何か長い処理。
return rtn;
}
}
そして実行。
public class CallableTest {
public static void main(String[] args)
throws InterruptedException,
ExecutionException {
FutureTask task =
new FutureTask(new CalculateSomething());
new Thread(task).start();
String result = task.get();
System.out.println(result);
}
}
FutureTask
が何者であるかはおいといて、結果はFutureTask#get()
でとってくる事ができる。
さらにjava.util.concurrent.ExecutorService
を使えば、スレッドの実行をスケジューリング、スレッド数の制限などの管理を行うことができる。
Java5.0で追加されたスレッド関連のクラスを説明するだけで一冊の本ができそう。。てか欲しいんですが!