FutureTask의 연산은 Callable 인터페이스를 구현하도록 되어있다.

FutureTask.get

예제

public class FutureTaskTest {
    public static void main(String[] args) throws InterruptedException, ExecutionException {
        // 어떤 비동기작업이라 가정하고
        FutureTask<String> task1 = new FutureTask<>(() -> "Task1");
        FutureTask<String> task2 = new FutureTask<>(() -> { throw new RuntimeException("Error!"); });
  
        new Thread(task1).start();
        new Thread(task2).start();
 
        // FutureTask.get() 은 작업이 완료될때까지 블러킹됨 (물론 여기서는 바로 돌려주겠지만..)
        System.out.println(task1.get());
        System.out.println(task2.get());
    }
}

결과는 다음과 같다.

Task1
Exception in thread "main" java.util.concurrent.ExecutionException: java.lang.RuntimeException: Error!
    at java.util.concurrent.FutureTask.report(FutureTask.java:122)
    at java.util.concurrent.FutureTask.get(FutureTask.java:192)
    at test.FutureTaskTest.main(FutureTaskTest.java:17)
Caused by: java.lang.RuntimeException: Error!
    at test.FutureTaskTest.lambda$1(FutureTaskTest.java:11)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.lang.Thread.run(Thread.java:745)