Class DefaultPromise<V>
- Direct Known Subclasses:
DefaultChannelGroupFuture,DefaultChannelPromise,DefaultProgressivePromise,ImmediateEventExecutor.ImmediatePromise,PromiseTask,ProxyHandler.LazyChannelPromise,SslHandler.LazyChannelPromise
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescriptionprivate static final classprivate static final classprivate static final classNested classes/interfaces inherited from interface java.util.concurrent.Future
Future.State -
Field Summary
FieldsModifier and TypeFieldDescriptionprivate static final DefaultPromise.CauseHolderprivate static final StackTraceElement[]private final EventExecutorprivate GenericFutureListener<? extends Future<?>> One or more listeners.private DefaultFutureListenersprivate static final InternalLoggerprivate static final intprivate booleanThreading - synchronized(this).static final StringSystem property with integer type value, that determine the max reentrancy/recursion level for when listener notifications prompt other listeners to be notified.private static final InternalLoggerprivate Objectprivate static final AtomicReferenceFieldUpdater<DefaultPromise, Object> private static final Objectprivate static final Objectprivate shortThreading - synchronized(this). -
Constructor Summary
ConstructorsModifierConstructorDescriptionprotectedSeeexecutor()for expectations of the executor.DefaultPromise(EventExecutor executor) Creates a new instance. -
Method Summary
Modifier and TypeMethodDescriptionaddListener(GenericFutureListener<? extends Future<? super V>> listener) Adds the specified listener to this future.private voidaddListener0(GenericFutureListener<? extends Future<? super V>> listener) addListeners(GenericFutureListener<? extends Future<? super V>>... listeners) Adds the specified listeners to this future.await()Waits for this future to be completed.booleanawait(long timeoutMillis) Waits for this future to be completed within the specified time limit.booleanWaits for this future to be completed within the specified time limit.private booleanawait0(long timeoutNanos, boolean interruptable) Waits for this future to be completed without interruption.booleanawaitUninterruptibly(long timeoutMillis) Waits for this future to be completed within the specified time limit without interruption.booleanawaitUninterruptibly(long timeout, TimeUnit unit) Waits for this future to be completed within the specified time limit without interruption.booleancancel(boolean mayInterruptIfRunning) If the cancellation was successful it will fail the future with aCancellationException.cause()Returns the cause of the failed I/O operation if the I/O operation has failed.private Throwableprotected voidprivate booleanCheck if there are any waiters and if so notify these.private voidprotected EventExecutorexecutor()Get the executor used to notify listeners when this promise is complete.get()getNow()Return the result without blocking.private voidbooleanreturnstrueif and only if the operation can be cancelled viaFuture.cancel(boolean).booleanprivate static booleanisCancelled0(Object result) booleanisDone()private static booleanbooleanReturnstrueif and only if the I/O operation was completed successfully.protected static voidnotifyListener(EventExecutor eventExecutor, Future<?> future, GenericFutureListener<?> listener) Notify a listener that a future has completed.private static voidnotifyListener0(Future future, GenericFutureListener l) private voidprivate voidnotifyListeners0(DefaultFutureListeners listeners) private voidprivate static voidnotifyListenerWithStackOverFlowProtection(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 ofDefaultPromisesince the listener(s) may be changed and is protected by a synchronized operation.private static voidnotifyProgressiveListener0(ProgressiveFuture future, GenericProgressiveFutureListener l, long progress, long total) (package private) voidnotifyProgressiveListeners(long progress, long total) Notify all progressive listeners.private static voidnotifyProgressiveListeners0(ProgressiveFuture<?> future, GenericProgressiveFutureListener<?>[] listeners, long progress, long total) private ObjectremoveListener(GenericFutureListener<? extends Future<? super V>> listener) Removes the first occurrence of the specified listener from this future.private voidremoveListener0(GenericFutureListener<? extends Future<? super V>> toRemove) removeListeners(GenericFutureListener<? extends Future<? super V>>... listeners) Removes the first occurrence for each of the listeners from this future.private voidprivate static voidsafeExecute(EventExecutor executor, Runnable task) setFailure(Throwable cause) Marks this future as a failure and notifies all listeners.private booleansetFailure0(Throwable cause) setSuccess(V result) Marks this future as a success and notifies all listeners.private booleansetSuccess0(V result) booleanMake this future impossible to cancel.private booleansync()Waits for this future until it is done, and rethrows the cause of the failure if this future failed.Waits for this future until it is done, and rethrows the cause of the failure if this future failed.toString()protected StringBuilderbooleantryFailure(Throwable cause) Marks this future as a failure and notifies all listeners.booleantrySuccess(V result) Marks this future as a success and notifies all listeners.Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, waitMethods inherited from interface java.util.concurrent.Future
exceptionNow, resultNow, state
-
Field Details
-
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:
-
logger
-
rejectedExecutionLogger
-
MAX_LISTENER_STACK_DEPTH
private static final int MAX_LISTENER_STACK_DEPTH -
RESULT_UPDATER
-
SUCCESS
-
UNCANCELLABLE
-
CANCELLATION_CAUSE_HOLDER
-
CANCELLATION_STACK
-
result
-
executor
-
listener
One or more listeners. Can be aGenericFutureListeneror 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
-
waiters
private short waitersThreading - synchronized(this). We are required to hold the monitor to use Java's underlying wait()/notifyAll(). -
notifyingListeners
private boolean notifyingListenersThreading - synchronized(this). We must prevent concurrent notification and FIFO listener notification if the executor changes.
-
-
Constructor Details
-
DefaultPromise
Creates a new instance.It is preferable to use
EventExecutor.newPromise()to create a new promise- Parameters:
executor- theEventExecutorwhich is used to notify the promise once it is complete. It is assumed this executor will protect againstStackOverflowErrorexceptions. The executor may be used to avoidStackOverflowErrorby executing aRunnableif the stack depth exceeds a threshold.
-
DefaultPromise
protected DefaultPromise()Seeexecutor()for expectations of the executor.
-
-
Method Details
-
setSuccess
Description copied from interface:PromiseMarks this future as a success and notifies all listeners. If it is success or failed already it will throw anIllegalStateException.- Specified by:
setSuccessin interfacePromise<V>
-
trySuccess
Description copied from interface:PromiseMarks this future as a success and notifies all listeners.- Specified by:
trySuccessin interfacePromise<V>- Returns:
trueif and only if successfully marked this future as a success. Otherwisefalsebecause this future is already marked as either a success or a failure.
-
setFailure
Description copied from interface:PromiseMarks this future as a failure and notifies all listeners. If it is success or failed already it will throw anIllegalStateException.- Specified by:
setFailurein interfacePromise<V>
-
tryFailure
Description copied from interface:PromiseMarks this future as a failure and notifies all listeners.- Specified by:
tryFailurein interfacePromise<V>- Returns:
trueif and only if successfully marked this future as a failure. Otherwisefalsebecause this future is already marked as either a success or a failure.
-
setUncancellable
public boolean setUncancellable()Description copied from interface:PromiseMake this future impossible to cancel.- Specified by:
setUncancellablein interfacePromise<V>- Returns:
trueif and only if successfully marked this future as uncancellable or it is already done without being cancelled.falseif this future has been cancelled already.
-
isSuccess
public boolean isSuccess()Description copied from interface:FutureReturnstrueif and only if the I/O operation was completed successfully. -
isCancellable
public boolean isCancellable()Description copied from interface:Futurereturnstrueif and only if the operation can be cancelled viaFuture.cancel(boolean).- Specified by:
isCancellablein interfaceFuture<V>
-
cause
Description copied from interface:FutureReturns the cause of the failed I/O operation if the I/O operation has failed. -
cause0
-
addListener
Description copied from interface:FutureAdds 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:
addListenerin interfaceFuture<V>- Specified by:
addListenerin interfacePromise<V>
-
addListeners
Description copied from interface:FutureAdds 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:
addListenersin interfaceFuture<V>- Specified by:
addListenersin interfacePromise<V>
-
removeListener
Description copied from interface:FutureRemoves 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:
removeListenerin interfaceFuture<V>- Specified by:
removeListenerin interfacePromise<V>
-
removeListeners
Description copied from interface:FutureRemoves 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:
removeListenersin interfaceFuture<V>- Specified by:
removeListenersin interfacePromise<V>
-
await
Description copied from interface:FutureWaits for this future to be completed. -
awaitUninterruptibly
Description copied from interface:FutureWaits for this future to be completed without interruption. This method catches anInterruptedExceptionand discards it silently.- Specified by:
awaitUninterruptiblyin interfaceFuture<V>- Specified by:
awaitUninterruptiblyin interfacePromise<V>
-
await
Description copied from interface:FutureWaits for this future to be completed within the specified time limit.- Specified by:
awaitin interfaceFuture<V>- Returns:
trueif and only if the future was completed within the specified time limit- Throws:
InterruptedException- if the current thread was interrupted
-
await
Description copied from interface:FutureWaits for this future to be completed within the specified time limit.- Specified by:
awaitin interfaceFuture<V>- Returns:
trueif and only if the future was completed within the specified time limit- Throws:
InterruptedException- if the current thread was interrupted
-
awaitUninterruptibly
Description copied from interface:FutureWaits for this future to be completed within the specified time limit without interruption. This method catches anInterruptedExceptionand discards it silently.- Specified by:
awaitUninterruptiblyin interfaceFuture<V>- Returns:
trueif and only if the future was completed within the specified time limit
-
awaitUninterruptibly
public boolean awaitUninterruptibly(long timeoutMillis) Description copied from interface:FutureWaits for this future to be completed within the specified time limit without interruption. This method catches anInterruptedExceptionand discards it silently.- Specified by:
awaitUninterruptiblyin interfaceFuture<V>- Returns:
trueif and only if the future was completed within the specified time limit
-
getNow
Description copied from interface:FutureReturn the result without blocking. If the future is not done yet this will returnnull.As it is possible that a
nullvalue 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 returnednullvalue. -
get
- Specified by:
getin interfaceFuture<V>- Overrides:
getin classAbstractFuture<V>- Throws:
InterruptedExceptionExecutionException
-
get
public V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException - Specified by:
getin interfaceFuture<V>- Overrides:
getin classAbstractFuture<V>- Throws:
InterruptedExceptionExecutionExceptionTimeoutException
-
cancel
public boolean cancel(boolean mayInterruptIfRunning) If the cancellation was successful it will fail the future with aCancellationException. -
isCancelled
public boolean isCancelled()- Specified by:
isCancelledin interfaceFuture<V>
-
isDone
public boolean isDone() -
sync
Description copied from interface:FutureWaits for this future until it is done, and rethrows the cause of the failure if this future failed. -
syncUninterruptibly
Description copied from interface:FutureWaits for this future until it is done, and rethrows the cause of the failure if this future failed.- Specified by:
syncUninterruptiblyin interfaceFuture<V>- Specified by:
syncUninterruptiblyin interfacePromise<V>
-
toString
-
toStringBuilder
-
executor
Get the executor used to notify listeners when this promise is complete.It is assumed this executor will protect against
StackOverflowErrorexceptions. The executor may be used to avoidStackOverflowErrorby executing aRunnableif 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_DEPTHthat will limit recursion to preventStackOverflowErrorand 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 ofDefaultPromisesince the listener(s) may be changed and is protected by a synchronized operation. -
notifyListenersNow
private void notifyListenersNow() -
notifyListeners0
-
notifyListener0
-
addListener0
-
removeListener0
-
setSuccess0
-
setFailure0
-
setValue0
-
checkNotifyWaiters
private boolean checkNotifyWaiters()Check if there are any waiters and if so notify these.- Returns:
trueif there are any listeners attached to the promise,falseotherwise.
-
incWaiters
private void incWaiters() -
decWaiters
private void decWaiters() -
rethrowIfFailed
private void rethrowIfFailed() -
await0
- Throws:
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
GenericProgressiveFutureListeners.- Parameters:
progress- the new progress.total- the total progress.
-
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
-
isDone0
-
safeExecute
-