概要
Futureパターンで非同期処理の結果を先に受け取る
詳細
Futureパターンにより、非同期処理の結果を先に受け取ります。
イメージとしては予約券。
サンプルコード
package thread; import java.util.Date; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.FutureTask; public class SampleThread { public interface CallBack { void callBack(); } public static void main(String[] args) { // シングルスレッドを生成するためのExecutorServiceを作成する ExecutorService executor = Executors.newSingleThreadExecutor(); FutureTask<String> future = new FutureTask<String>(new Callable<String>() { public String call() { try { System.out.println("inner:" + new Date()); Thread.sleep(1000); return "hoge"; } catch (Exception e) { e.printStackTrace(); } return null; } }); try { Future<String> ret = (Future<String>) executor.submit(future); } catch (Exception e) { e.printStackTrace(); } System.out.println("outer:" + new Date()); try { String ret = future.get(); System.out.println(ret); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } finally { executor.shutdown(); } } }
出力
※外部の処理が終了してから、Thread内部のログが出力されていることが分かる。
さらに、その後処理結果を取得している。
outer:Tue May 14 00:01:46 JST 2013 inner:Tue May 14 00:01:46 JST 2013 hoge