Rso's Jotter

日々の開発の知見のメモやその他雑記

FutureTaskで別スレッドから値を受け取る。

Javaにはjava.util.concurrent以下にマルチスレッドでプログラムを実行するのに
便利なライブラリが用意されている。

その中でスレッドを実行したとき、実行したスレッドの結果が他で欲しい場合に使える
FutureTaskが便利なので紹介。


まず、値を返すスレッドを実行するためにCallableを定義する。これは値を返すRunableのようなもので、
戻り値の型はジェネリクスで指定できる。

	Callable<String> c = new Callable<String>(){
		@Override
		public String call() throws Exception {
			
			Thread.sleep(10000); //時間がかかる処理を想定
			return "finish";
		}		
	};


これをFutureTaskの引数にしてやり、それをExecutorで実行するだけで良い。

	public void test(){
		ExecutorService executor = Executors.newFixedThreadPool(1);
		FutureTask<String> f = new FutureTask<String>(c);
		executor.execute(f);
		String ret = f.get(); //スレッドの実行結果を得る
	}


FutureTaskのgetメソッドを呼べば別スレッドで実行していた結果を取得できる。
これがありがたいのはFutureTaskがまだ実行中である場合はブロックしてくれるということ。
そのほかFutureTaskはisDone()など実行完了を判定できるメソッドもあるのでこのあたりを適当に組み合わせると
それなりにマルチスレッドで動くものが作れるかもしれない。