FutureTask의 연산은 Callable 인터페이스를 구현하도록 되어있다.
대기 / 시작됨 / 종료됨의 상태를 갖을 수 있다.정상종료 / 취소 / 예외발생 등을 알수 있다.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)