FutureTask — 취소 가능한 비동기 계산

FutureTask — 취소 가능한 비동기 계산

FutureTask<V>는 취소 가능한 비동기 계산을 나타내며 Future의 기본 구현을 제공하는 클래스예요. Callable이나 Runnable을 감싸고, Runnable을 구현하므로 Executor에 제출해 실행할 수 있어요.

출처: Java API Reference

본문

개념 이해하기

FutureTask는 취소 가능한 비동기 계산이에요. 계산을 시작·취소하고, 완료 여부를 조회하고, 결과를 조회하는 메서드를 가진 Future의 기본 구현을 제공해요.

public class FutureTask<V>
extends Object
implements RunnableFuture<V>
  • 결과는 계산이 완료됐을 때만 조회할 수 있어요. 아직 완료되지 않으면 get 메서드가 블로킹해요.
  • 완료되면 재시작하거나 취소할 수 없어요(runAndReset()으로 호출되지 않는 한).
  • Callable이나 Runnable 객체를 감싸는 데 쓰고, Runnable 구현이라 Executor에 제출될 수 있어요.
  • 독립 클래스로 쓰는 것 외에도, 커스텀 태스크 클래스를 만들 때 유용한 protected 기능을 제공해요.

생성자

public FutureTask(Callable<V> callable) — 실행 시 주어진 Callable을 실행할 FutureTask를 만들어요.

  • NullPointerExceptioncallablenull일 때

public FutureTask(Runnable runnable, V result) — 실행 시 주어진 Runnable을 실행하고, 성공 완료 시 get이 주어진 result를 반환하도록 하는 FutureTask를 만들어요.

  • NullPointerExceptionrunnablenull일 때. 특정 결과가 필요 없으면 Future<?> f = new FutureTask<Void>(runnable, null) 형태 사용

Future 메서드

public boolean isCancelled() — 정상 완료 전에 취소됐으면 true.

public boolean isDone() — 정상 종료, 예외, 취소 중 어떤 방식으로든 완료됐으면 true.

public boolean cancel(boolean mayInterruptIfRunning) — 태스크 실행 취소를 시도해요. 이미 완료된 태스크는 취소할 수 없어요(false). 시작됐다면 mayInterruptIfRunning이 실행 스레드를 인터럽트할지 결정해요.

public V get() throws InterruptedException, ExecutionException — 계산이 완료될 때까지 기다렸다가 결과를 조회해요.

  • CancellationException, InterruptedException, ExecutionException

public V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException — 최대 timeout까지 기다렸다가 결과를 조회해요.

  • TimeoutException

protected 훅 메서드

protected void done() — 태스크가 isDone 상태로 전이될 때(정상 또는 취소로) 호출되는 protected 메서드예요. 기본 구현은 아무것도 하지 않아요. 서브클래스는 완료 콜백을 호출하거나 북키핑을 위해 오버라이드할 수 있어요. 이 메서드 안에서 상태를 조회해 취소 여부를 알 수 있어요.

protected void set(V v) — 이미 설정·취소되지 않았다면 이 future의 결과를 주어진 값으로 설정해요. run()이 계산 성공 시 내부적으로 호출해요.

protected void setException(Throwable t) — 이미 설정·취소되지 않았다면 주어진 throwable을 cause로 가진 ExecutionException을 보고하게 해요. run()이 계산 실패 시 내부적으로 호출해요.

protected boolean runAndReset() — 결과를 설정하지 않고 계산을 실행하고, 예외나 취소가 발생하지 않으면 future를 초기 상태로 재설정해요. 본질적으로 여러 번 실행되는 태스크를 위해 설계됐어요. 성공적으로 실행·재설정됐으면 true.

그 외

public void run() — 취소되지 않았다면 이 future를 그 계산의 결과로 설정해요. (Runnable 구현)

public String toString() — 이 FutureTask와 완료 상태를 식별하는 문자열을 반환해요. 상태는 "Completed Normally", "Completed Exceptionally", "Cancelled", "Not completed" 중 하나를 대괄호에 담아요.

더 알아보기 (Learn more)