public final class
SettableFuture
<V>
extends
AbstractFuture
<V>
Since:
9.0 (in 1.0 as
ValueFuture
)
Author:
Sven Mawson
boolean
set
(
V
value)
Sets the result of this
Future
unless this
Future
has already been cancelled or
set (including
set asynchronously
).
boolean
setException
(
Throwable
throwable)
Sets the failed result of this
Future
unless this
Future
has already been
cancelled or set (including
set asynchronously
).
boolean
setFuture
(
ListenableFuture
<? extends
V
> future)
Sets the result of this
Future
to match the supplied input
Future
once the
supplied
Future
is done, unless this
Future
has already been cancelled or set
(including "set asynchronously," defined below).
V
value)
Sets the result of this
Future
unless this
Future
has already been cancelled or
set (including
set asynchronously
). When a call to this method returns,
the
Future
is guaranteed to be
done
only if
the call was
accepted (in which case it returns
true
). If it returns
false
, the
Future
may have previously been set asynchronously, in which case its result may not be known
yet. That result, though not yet known, cannot be overridden by a call to a
set*
method, only by a call to
AbstractFuture.cancel(boolean)
.
Overrides:
set
in class
AbstractFuture
<
V
>
Parameters:
value
- the value to be used as the result
Returns:
true if the attempt was accepted, completing the
Future
setException
public boolean setException(Throwable throwable)
Sets the failed result of this
Future
unless this
Future
has already been
cancelled or set (including
set asynchronously
). When a call to this
method returns, the
Future
is guaranteed to be
done
only if
the call was accepted (in which case it returns
true
). If it returns
false
, the
Future
may have previously been set asynchronously, in which case its result may not be
known yet. That result, though not yet known, cannot be overridden by a call to a
set*
method, only by a call to
AbstractFuture.cancel(boolean)
.
Overrides:
setException
in class
AbstractFuture
<
V
>
Parameters:
throwable
- the exception to be used as the failed result
Returns:
true if the attempt was accepted, completing the
Future
@Beta
public boolean setFuture(ListenableFuture<? extends V> future)
Sets the result of this
Future
to match the supplied input
Future
once the
supplied
Future
is done, unless this
Future
has already been cancelled or set
(including "set asynchronously," defined below).
If the supplied future is
done
when this method is called and the call
is accepted, then this future is guaranteed to have been completed with the supplied future by
the time this method returns. If the supplied future is not done and the call is accepted, then
the future will be
set asynchronously
. Note that such a result, though not yet known,
cannot be overridden by a call to a
set*
method, only by a call to
AbstractFuture.cancel(boolean)
.
If the call
setFuture(delegate)
is accepted and this
Future
is later
cancelled, cancellation will be propagated to
delegate
. Additionally, any call to
setFuture
after any cancellation will propagate cancellation to the supplied
Future
.
Note that, even if the supplied future is cancelled and it causes this future to complete,
it will never trigger interruption behavior. In particular, it will not cause this future to
invoke the
AbstractFuture.interruptTask()
method, and the
AbstractFuture.wasInterrupted()
method will not
return
true
.
Overrides:
setFuture
in class
AbstractFuture
<
V
>
Parameters:
future
- the future to delegate to
Returns:
true if the attempt was accepted, indicating that the
Future
was not previously
cancelled or set.
throws
InterruptedException
,
ExecutionException
The default
AbstractFuture
implementation throws
InterruptedException
if the
current thread is interrupted during the call, even if the value is already available.
Specified by:
get
in interface
Future
<V>
Overrides:
get
in class
AbstractFuture
<V>
Throws:
InterruptedException
ExecutionException
The default
AbstractFuture
implementation throws
InterruptedException
if the
current thread is interrupted during the call, even if the value is already available.
Specified by:
get
in interface
Future
<V>
Overrides:
get
in class
AbstractFuture
<V>
Throws:
InterruptedException
ExecutionException
TimeoutException
public final void addListener(Runnable listener,
Executor executor)
Registers a listener to be
run
on the given executor.
The listener will run when the
Future
's computation is
complete
or, if the computation is already complete, immediately.
There is no guaranteed ordering of execution of listeners, but any listener added through
this method is guaranteed to be called once the computation is complete.
Exceptions thrown by a listener will be propagated up to the executor. Any exception thrown
during
Executor.execute
(e.g., a
RejectedExecutionException
or an exception
thrown by
direct execution
) will be caught and
logged.
Note: For fast, lightweight listeners that would be safe to execute in any thread, consider
MoreExecutors.directExecutor()
. Otherwise, avoid it. Heavyweight
directExecutor
listeners can cause problems, and these problems can be difficult to reproduce because they
depend on timing. For example:
The listener may be executed by the caller of
addListener
. That caller may be a UI
thread or other latency-sensitive thread. This can harm UI responsiveness.
The listener may be executed by the thread that completes this
Future
. That thread
may be an internal system thread such as an RPC network thread. Blocking that thread may stall
progress of the whole system. It may even cause a deadlock.
The listener may delay other listeners, even listeners that are not themselves
directExecutor
listeners.
This is the most general listener interface. For common operations performed using
listeners, see
Futures
. For a simplified but general listener interface, see
addCallback()
.
Memory consistency effects: Actions in a thread prior to adding a listener
happen-before
its execution begins, perhaps in another thread.
Specified by:
addListener
in interface
ListenableFuture
<V>
Overrides:
addListener
in class
AbstractFuture
<V>
Parameters:
listener
- the listener to run when the computation is complete
executor
- the executor to run the listener in
cancel
public final boolean cancel(boolean mayInterruptIfRunning)
If a cancellation attempt succeeds on a
Future
that had previously been
set asynchronously
, then the cancellation will also be propagated to the delegate
Future
that was supplied in the
setFuture
call.
Rather than override this method to perform additional cancellation work or cleanup,
subclasses should override
AbstractFuture.afterDone()
, consulting
AbstractFuture.isCancelled()
and
AbstractFuture.wasInterrupted()
as necessary. This ensures that the work is done even if the future is
cancelled without a call to
cancel
, such as by calling
setFuture(cancelledFuture)
.
Specified by:
cancel
in interface
Future
<V>
Overrides:
cancel
in class
AbstractFuture
<V>