Class DefaultPromise<V>
- java.lang.Object
-
- io.netty.util.concurrent.AbstractFuture<V>
-
- io.netty.util.concurrent.DefaultPromise<V>
-
- Direct Known Subclasses:
DefaultChannelGroupFuture
,DefaultChannelPromise
,DefaultProgressivePromise
,ImmediateEventExecutor.ImmediatePromise
,PromiseTask
,ProxyHandler.LazyChannelPromise
,SslHandler.LazyChannelPromise
public class DefaultPromise<V> extends AbstractFuture<V> implements Promise<V>
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description private static class
DefaultPromise.CauseHolder
private static class
DefaultPromise.LeanCancellationException
private static class
DefaultPromise.StacklessCancellationException
-
Field Summary
Fields Modifier and Type Field Description private static DefaultPromise.CauseHolder
CANCELLATION_CAUSE_HOLDER
private static java.lang.StackTraceElement[]
CANCELLATION_STACK
private EventExecutor
executor
private GenericFutureListener<? extends Future<?>>
listener
One or more listeners.private DefaultFutureListeners
listeners
private static InternalLogger
logger
private static int
MAX_LISTENER_STACK_DEPTH
private boolean
notifyingListeners
Threading - synchronized(this).static java.lang.String
PROPERTY_MAX_LISTENER_STACK_DEPTH
System property with integer type value, that determine the max reentrancy/recursion level for when listener notifications prompt other listeners to be notified.private static InternalLogger
rejectedExecutionLogger
private java.lang.Object
result
private static java.util.concurrent.atomic.AtomicReferenceFieldUpdater<DefaultPromise,java.lang.Object>
RESULT_UPDATER
private static java.lang.Object
SUCCESS
private static java.lang.Object
UNCANCELLABLE
private short
waiters
Threading - synchronized(this).
-
Constructor Summary
Constructors Modifier Constructor Description protected
DefaultPromise()
Seeexecutor()
for expectations of the executor.DefaultPromise(EventExecutor executor)
Creates a new instance.
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description Promise<V>
addListener(GenericFutureListener<? extends Future<? super V>> listener)
Adds the specified listener to this future.private void
addListener0(GenericFutureListener<? extends Future<? super V>> listener)
Promise<V>
addListeners(GenericFutureListener<? extends Future<? super V>>... listeners)
Adds the specified listeners to this future.Promise<V>
await()
Waits for this future to be completed.boolean
await(long timeoutMillis)
Waits for this future to be completed within the specified time limit.boolean
await(long timeout, java.util.concurrent.TimeUnit unit)
Waits for this future to be completed within the specified time limit.private boolean
await0(long timeoutNanos, boolean interruptable)
Promise<V>
awaitUninterruptibly()
Waits for this future to be completed without interruption.boolean
awaitUninterruptibly(long timeoutMillis)
Waits for this future to be completed within the specified time limit without interruption.boolean
awaitUninterruptibly(long timeout, java.util.concurrent.TimeUnit unit)
Waits for this future to be completed within the specified time limit without interruption.boolean
cancel(boolean mayInterruptIfRunning)
If the cancellation was successful it will fail the future with aCancellationException
.java.lang.Throwable
cause()
Returns the cause of the failed I/O operation if the I/O operation has failed.private java.lang.Throwable
cause0(java.lang.Object result)
protected void
checkDeadLock()
private boolean
checkNotifyWaiters()
Check if there are any waiters and if so notify these.private void
decWaiters()
protected EventExecutor
executor()
Get the executor used to notify listeners when this promise is complete.V
get()
V
get(long timeout, java.util.concurrent.TimeUnit unit)
V
getNow()
Return the result without blocking.private void
incWaiters()
boolean
isCancellable()
returnstrue
if and only if the operation can be cancelled viaFuture.cancel(boolean)
.boolean
isCancelled()
private static boolean
isCancelled0(java.lang.Object result)
boolean
isDone()
private static boolean
isDone0(java.lang.Object result)
boolean
isSuccess()
Returnstrue
if and only if the I/O operation was completed successfully.protected static void
notifyListener(EventExecutor eventExecutor, Future<?> future, GenericFutureListener<?> listener)
Notify a listener that a future has completed.private static void
notifyListener0(Future future, GenericFutureListener l)
private void
notifyListeners()
private void
notifyListeners0(DefaultFutureListeners listeners)
private void
notifyListenersNow()
private static void
notifyListenerWithStackOverFlowProtection(EventExecutor executor, Future<?> future, GenericFutureListener<?> listener)
The logic in this method should be identical tonotifyListeners()
but cannot share code because the listener(s) cannot be cached for an instance ofDefaultPromise
since the listener(s) may be changed and is protected by a synchronized operation.private static void
notifyProgressiveListener0(ProgressiveFuture future, GenericProgressiveFutureListener l, long progress, long total)
(package private) void
notifyProgressiveListeners(long progress, long total)
Notify all progressive listeners.private static void
notifyProgressiveListeners0(ProgressiveFuture<?> future, GenericProgressiveFutureListener<?>[] listeners, long progress, long total)
private java.lang.Object
progressiveListeners()
Promise<V>
removeListener(GenericFutureListener<? extends Future<? super V>> listener)
Removes the first occurrence of the specified listener from this future.private void
removeListener0(GenericFutureListener<? extends Future<? super V>> toRemove)
Promise<V>
removeListeners(GenericFutureListener<? extends Future<? super V>>... listeners)
Removes the first occurrence for each of the listeners from this future.private void
rethrowIfFailed()
private static void
safeExecute(EventExecutor executor, java.lang.Runnable task)
Promise<V>
setFailure(java.lang.Throwable cause)
Marks this future as a failure and notifies all listeners.private boolean
setFailure0(java.lang.Throwable cause)
Promise<V>
setSuccess(V result)
Marks this future as a success and notifies all listeners.private boolean
setSuccess0(V result)
boolean
setUncancellable()
Make this future impossible to cancel.private boolean
setValue0(java.lang.Object objResult)
Promise<V>
sync()
Waits for this future until it is done, and rethrows the cause of the failure if this future failed.Promise<V>
syncUninterruptibly()
Waits for this future until it is done, and rethrows the cause of the failure if this future failed.java.lang.String
toString()
protected java.lang.StringBuilder
toStringBuilder()
boolean
tryFailure(java.lang.Throwable cause)
Marks this future as a failure and notifies all listeners.boolean
trySuccess(V result)
Marks this future as a success and notifies all listeners.
-
-
-
Field Detail
-
PROPERTY_MAX_LISTENER_STACK_DEPTH
public static final java.lang.String PROPERTY_MAX_LISTENER_STACK_DEPTH
System property with integer type value, that determine the max reentrancy/recursion level for when listener notifications prompt other listeners to be notified.When the reentrancy/recursion level becomes greater than this number, a new task will instead be scheduled on the event loop, to finish notifying any subsequent listners.
The default value is
8
.- See Also:
- Constant Field Values
-
logger
private static final InternalLogger logger
-
rejectedExecutionLogger
private static final InternalLogger rejectedExecutionLogger
-
MAX_LISTENER_STACK_DEPTH
private static final int MAX_LISTENER_STACK_DEPTH
-
RESULT_UPDATER
private static final java.util.concurrent.atomic.AtomicReferenceFieldUpdater<DefaultPromise,java.lang.Object> RESULT_UPDATER
-
SUCCESS
private static final java.lang.Object SUCCESS
-
UNCANCELLABLE
private static final java.lang.Object UNCANCELLABLE
-
CANCELLATION_CAUSE_HOLDER
private static final DefaultPromise.CauseHolder CANCELLATION_CAUSE_HOLDER
-
CANCELLATION_STACK
private static final java.lang.StackTraceElement[] CANCELLATION_STACK
-
result
private volatile java.lang.Object result
-
executor
private final EventExecutor executor
-
listener
private GenericFutureListener<? extends Future<?>> listener
One or more listeners. Can be aGenericFutureListener
or aDefaultFutureListeners
. Ifnull
, it means either 1) no listeners were added yet or 2) all listeners were notified.Threading - synchronized(this). We must support adding listeners when there is no EventExecutor.
-
listeners
private DefaultFutureListeners listeners
-
waiters
private short waiters
Threading - synchronized(this). We are required to hold the monitor to use Java's underlying wait()/notifyAll().
-
notifyingListeners
private boolean notifyingListeners
Threading - synchronized(this). We must prevent concurrent notification and FIFO listener notification if the executor changes.
-
-
Constructor Detail
-
DefaultPromise
public DefaultPromise(EventExecutor executor)
Creates a new instance.It is preferable to use
EventExecutor.newPromise()
to create a new promise- Parameters:
executor
- theEventExecutor
which is used to notify the promise once it is complete. It is assumed this executor will protect againstStackOverflowError
exceptions. The executor may be used to avoidStackOverflowError
by executing aRunnable
if the stack depth exceeds a threshold.
-
DefaultPromise
protected DefaultPromise()
Seeexecutor()
for expectations of the executor.
-
-
Method Detail
-
setSuccess
public Promise<V> setSuccess(V result)
Description copied from interface:Promise
Marks this future as a success and notifies all listeners. If it is success or failed already it will throw anIllegalStateException
.- Specified by:
setSuccess
in interfacePromise<V>
-
trySuccess
public boolean trySuccess(V result)
Description copied from interface:Promise
Marks this future as a success and notifies all listeners.- Specified by:
trySuccess
in interfacePromise<V>
- Returns:
true
if and only if successfully marked this future as a success. Otherwisefalse
because this future is already marked as either a success or a failure.
-
setFailure
public Promise<V> setFailure(java.lang.Throwable cause)
Description copied from interface:Promise
Marks this future as a failure and notifies all listeners. If it is success or failed already it will throw anIllegalStateException
.- Specified by:
setFailure
in interfacePromise<V>
-
tryFailure
public boolean tryFailure(java.lang.Throwable cause)
Description copied from interface:Promise
Marks this future as a failure and notifies all listeners.- Specified by:
tryFailure
in interfacePromise<V>
- Returns:
true
if and only if successfully marked this future as a failure. Otherwisefalse
because this future is already marked as either a success or a failure.
-
setUncancellable
public boolean setUncancellable()
Description copied from interface:Promise
Make this future impossible to cancel.- Specified by:
setUncancellable
in interfacePromise<V>
- Returns:
true
if and only if successfully marked this future as uncancellable or it is already done without being cancelled.false
if this future has been cancelled already.
-
isSuccess
public boolean isSuccess()
Description copied from interface:Future
Returnstrue
if and only if the I/O operation was completed successfully.
-
isCancellable
public boolean isCancellable()
Description copied from interface:Future
returnstrue
if and only if the operation can be cancelled viaFuture.cancel(boolean)
.- Specified by:
isCancellable
in interfaceFuture<V>
-
cause
public java.lang.Throwable cause()
Description copied from interface:Future
Returns the cause of the failed I/O operation if the I/O operation has failed.
-
cause0
private java.lang.Throwable cause0(java.lang.Object result)
-
addListener
public Promise<V> addListener(GenericFutureListener<? extends Future<? super V>> listener)
Description copied from interface:Future
Adds the specified listener to this future. The specified listener is notified when this future is done. If this future is already completed, the specified listener is notified immediately.- Specified by:
addListener
in interfaceFuture<V>
- Specified by:
addListener
in interfacePromise<V>
-
addListeners
public Promise<V> addListeners(GenericFutureListener<? extends Future<? super V>>... listeners)
Description copied from interface:Future
Adds the specified listeners to this future. The specified listeners are notified when this future is done. If this future is already completed, the specified listeners are notified immediately.- Specified by:
addListeners
in interfaceFuture<V>
- Specified by:
addListeners
in interfacePromise<V>
-
removeListener
public Promise<V> removeListener(GenericFutureListener<? extends Future<? super V>> listener)
Description copied from interface:Future
Removes the first occurrence of the specified listener from this future. The specified listener is no longer notified when this future is done. If the specified listener is not associated with this future, this method does nothing and returns silently.- Specified by:
removeListener
in interfaceFuture<V>
- Specified by:
removeListener
in interfacePromise<V>
-
removeListeners
public Promise<V> removeListeners(GenericFutureListener<? extends Future<? super V>>... listeners)
Description copied from interface:Future
Removes the first occurrence for each of the listeners from this future. The specified listeners are no longer notified when this future is done. If the specified listeners are not associated with this future, this method does nothing and returns silently.- Specified by:
removeListeners
in interfaceFuture<V>
- Specified by:
removeListeners
in interfacePromise<V>
-
await
public Promise<V> await() throws java.lang.InterruptedException
Description copied from interface:Future
Waits for this future to be completed.
-
awaitUninterruptibly
public Promise<V> awaitUninterruptibly()
Description copied from interface:Future
Waits for this future to be completed without interruption. This method catches anInterruptedException
and discards it silently.- Specified by:
awaitUninterruptibly
in interfaceFuture<V>
- Specified by:
awaitUninterruptibly
in interfacePromise<V>
-
await
public boolean await(long timeout, java.util.concurrent.TimeUnit unit) throws java.lang.InterruptedException
Description copied from interface:Future
Waits for this future to be completed within the specified time limit.
-
await
public boolean await(long timeoutMillis) throws java.lang.InterruptedException
Description copied from interface:Future
Waits for this future to be completed within the specified time limit.
-
awaitUninterruptibly
public boolean awaitUninterruptibly(long timeout, java.util.concurrent.TimeUnit unit)
Description copied from interface:Future
Waits for this future to be completed within the specified time limit without interruption. This method catches anInterruptedException
and discards it silently.- Specified by:
awaitUninterruptibly
in interfaceFuture<V>
- Returns:
true
if and only if the future was completed within the specified time limit
-
awaitUninterruptibly
public boolean awaitUninterruptibly(long timeoutMillis)
Description copied from interface:Future
Waits for this future to be completed within the specified time limit without interruption. This method catches anInterruptedException
and discards it silently.- Specified by:
awaitUninterruptibly
in interfaceFuture<V>
- Returns:
true
if and only if the future was completed within the specified time limit
-
getNow
public V getNow()
Description copied from interface:Future
Return the result without blocking. If the future is not done yet this will returnnull
.As it is possible that a
null
value is used to mark the future as successful you also need to check if the future is really done withFuture.isDone()
and not rely on the returnednull
value.
-
get
public V get() throws java.lang.InterruptedException, java.util.concurrent.ExecutionException
- Specified by:
get
in interfacejava.util.concurrent.Future<V>
- Overrides:
get
in classAbstractFuture<V>
- Throws:
java.lang.InterruptedException
java.util.concurrent.ExecutionException
-
get
public V get(long timeout, java.util.concurrent.TimeUnit unit) throws java.lang.InterruptedException, java.util.concurrent.ExecutionException, java.util.concurrent.TimeoutException
- Specified by:
get
in interfacejava.util.concurrent.Future<V>
- Overrides:
get
in classAbstractFuture<V>
- Throws:
java.lang.InterruptedException
java.util.concurrent.ExecutionException
java.util.concurrent.TimeoutException
-
cancel
public boolean cancel(boolean mayInterruptIfRunning)
If the cancellation was successful it will fail the future with aCancellationException
.
-
isCancelled
public boolean isCancelled()
- Specified by:
isCancelled
in interfacejava.util.concurrent.Future<V>
-
isDone
public boolean isDone()
- Specified by:
isDone
in interfacejava.util.concurrent.Future<V>
-
sync
public Promise<V> sync() throws java.lang.InterruptedException
Description copied from interface:Future
Waits for this future until it is done, and rethrows the cause of the failure if this future failed.
-
syncUninterruptibly
public Promise<V> syncUninterruptibly()
Description copied from interface:Future
Waits for this future until it is done, and rethrows the cause of the failure if this future failed.- Specified by:
syncUninterruptibly
in interfaceFuture<V>
- Specified by:
syncUninterruptibly
in interfacePromise<V>
-
toString
public java.lang.String toString()
- Overrides:
toString
in classjava.lang.Object
-
toStringBuilder
protected java.lang.StringBuilder toStringBuilder()
-
executor
protected EventExecutor executor()
Get the executor used to notify listeners when this promise is complete.It is assumed this executor will protect against
StackOverflowError
exceptions. The executor may be used to avoidStackOverflowError
by executing aRunnable
if the stack depth exceeds a threshold.- Returns:
- The executor used to notify listeners when this promise is complete.
-
checkDeadLock
protected void checkDeadLock()
-
notifyListener
protected static void notifyListener(EventExecutor eventExecutor, Future<?> future, GenericFutureListener<?> listener)
Notify a listener that a future has completed.This method has a fixed depth of
MAX_LISTENER_STACK_DEPTH
that will limit recursion to preventStackOverflowError
and will stop notifying listeners added after this threshold is exceeded.- Parameters:
eventExecutor
- the executor to use to notify the listenerlistener
.future
- the future that is complete.listener
- the listener to notify.
-
notifyListeners
private void notifyListeners()
-
notifyListenerWithStackOverFlowProtection
private static void notifyListenerWithStackOverFlowProtection(EventExecutor executor, Future<?> future, GenericFutureListener<?> listener)
The logic in this method should be identical tonotifyListeners()
but cannot share code because the listener(s) cannot be cached for an instance ofDefaultPromise
since the listener(s) may be changed and is protected by a synchronized operation.
-
notifyListenersNow
private void notifyListenersNow()
-
notifyListeners0
private void notifyListeners0(DefaultFutureListeners listeners)
-
notifyListener0
private static void notifyListener0(Future future, GenericFutureListener l)
-
addListener0
private void addListener0(GenericFutureListener<? extends Future<? super V>> listener)
-
removeListener0
private void removeListener0(GenericFutureListener<? extends Future<? super V>> toRemove)
-
setSuccess0
private boolean setSuccess0(V result)
-
setFailure0
private boolean setFailure0(java.lang.Throwable cause)
-
setValue0
private boolean setValue0(java.lang.Object objResult)
-
checkNotifyWaiters
private boolean checkNotifyWaiters()
Check if there are any waiters and if so notify these.- Returns:
true
if there are any listeners attached to the promise,false
otherwise.
-
incWaiters
private void incWaiters()
-
decWaiters
private void decWaiters()
-
rethrowIfFailed
private void rethrowIfFailed()
-
await0
private boolean await0(long timeoutNanos, boolean interruptable) throws java.lang.InterruptedException
- Throws:
java.lang.InterruptedException
-
notifyProgressiveListeners
void notifyProgressiveListeners(long progress, long total)
Notify all progressive listeners.No attempt is made to ensure notification order if multiple calls are made to this method before the original invocation completes.
This will do an iteration over all listeners to get all of type
GenericProgressiveFutureListener
s.- Parameters:
progress
- the new progress.total
- the total progress.
-
progressiveListeners
private java.lang.Object progressiveListeners()
-
notifyProgressiveListeners0
private static void notifyProgressiveListeners0(ProgressiveFuture<?> future, GenericProgressiveFutureListener<?>[] listeners, long progress, long total)
-
notifyProgressiveListener0
private static void notifyProgressiveListener0(ProgressiveFuture future, GenericProgressiveFutureListener l, long progress, long total)
-
isCancelled0
private static boolean isCancelled0(java.lang.Object result)
-
isDone0
private static boolean isDone0(java.lang.Object result)
-
safeExecute
private static void safeExecute(EventExecutor executor, java.lang.Runnable task)
-
-