Future和FutureTask的区别

Future和FutureTask的区别

Future接口

Future是Java异步计算结果的抽象,表示异步任务的执行结果。

1
2
3
4
5
6
7
public interface Future<V> {
V get() throws InterruptedException, ExecutionException;
V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException;
boolean cancel(boolean mayInterruptIfRunning);
boolean isCancelled();
boolean isDone();
}

FutureTask

FutureTask是Future的实现类,同时实现了Runnable接口。

1
2
public class FutureTask<V> implements RunnableFuture<V> {}
public interface RunnableFuture<V> extends Runnable, Future<V> {}

使用区别

1
2
3
4
5
6
7
8
9
// Future用法
ExecutorService executor = Executors.newSingleThreadExecutor();
Future<String> future = executor.submit(() -> "result");
String result = future.get();

// FutureTask用法
FutureTask<String> task = new FutureTask<>(() -> "result");
new Thread(task).start();
String result = task.get();

适用场景

  • Future:提交给线程池,返回Future
  • FutureTask:可作为Runnable直接在线程中执行

总结

FutureTask更灵活,可单独运行;Future配合线程池使用更方便。