Tbpgr Blog

Employee Experience Engineer tbpgr(てぃーびー) のブログ

Java | Futureパターンで非同期処理の結果を先に受け取る

概要

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