What's the difference between Future and FutureTask in Java?
Since use ExecutorService
can submit
a Callable
task and return a Future
, why need to use FutureTask
to wrap Callable
task and use the method execute
? I feel they both do the same thing.
FutureTask
This class provides a base implementation of Future
, with methods to start and cancel a computation
Future is the interface
In fact you are correct. The two approaches are identical. You generally don't need to wrap them yourself. If you are, you're likely duplicating the code in AbstractExecutorService:
/**
* Returns a <tt>RunnableFuture</tt> for the given callable task.
*
* @param callable the callable task being wrapped
* @return a <tt>RunnableFuture</tt> which when run will call the
* underlying callable and which, as a <tt>Future</tt>, will yield
* the callable's result as its result and provide for
* cancellation of the underlying task.
* @since 1.6
*/
protected <T> RunnableFuture<T> newTaskFor(Callable<T> callable) {
return new FutureTask<T>(callable);
}
The only difference between Future and RunnableFuture, is the run() method:
/**
* A {@link Future} that is {@link Runnable}. Successful execution of
* the <tt>run</tt> method causes completion of the <tt>Future</tt>
* and allows access to its results.
* @see FutureTask
* @see Executor
* @since 1.6
* @author Doug Lea
* @param <V> The result type returned by this Future's <tt>get</tt> method
*/
public interface RunnableFuture<V> extends Runnable, Future<V> {
/**
* Sets this Future to the result of its computation
* unless it has been cancelled.
*/
void run();
}
A good reason to let the Executor construct the FutureTask for you is to ensure that there is no possible way more than one reference exists to the FutureTask instance. That is, the Executor owns this instance.
Future
is just interface. Behind the scene, the implementation is FutureTask
.
You can absolutely use FutureTask
manually but you will lose the advantages of using Executor
(pooling thread, limit the thread, etc). Using FutureTask
is quite similar to using the old Thread
and using the run method.
You would only need to use FutureTask if you want to change its behaviour or access its Callable later. For 99% of uses, just use Callable and Future.