Package jadex.commons.future
Class Future<E>
- java.lang.Object
-
- jadex.commons.future.Future<E>
-
- All Implemented Interfaces:
IForwardCommandFuture,IFuture<E>
- Direct Known Subclasses:
IntermediateFuture,TerminableDelegationFuture,TerminableFuture
public class Future<E> extends java.lang.Object implements IFuture<E>, IForwardCommandFuture
Future that includes mechanisms for callback notification. This allows a caller to decide if a) a blocking call to get() should be used b) a callback shall be invoked
-
-
Nested Class Summary
-
Nested classes/interfaces inherited from interface jadex.commons.future.IForwardCommandFuture
IForwardCommandFuture.Type
-
-
Field Summary
Fields Modifier and Type Field Description protected static java.lang.StringCALLER_QUEUEDA caller is queued for suspension.protected static java.lang.StringCALLER_RESUMEDA caller is resumed.protected static java.lang.StringCALLER_SUSPENDEDA caller is suspended.protected java.util.Map<ISuspendable,java.lang.String>callersThe blocked callers (caller->state).protected java.lang.ExceptioncreationFor capturing call stack of future creation.static booleanDEBUGDebug flag.protected java.lang.ExceptionexceptionThe exception (if any).protected java.lang.ExceptionfirstFor capturing call stack of first setResult/Exception call.protected IResultListener<E>listenerThe first listener (for avoiding array creation).protected java.util.List<IResultListener<E>>listenersThe listeners.static booleanNO_STACK_COMPACTIONDisable Stack unfolding for easier debugging.static longNONEConstant for no timeout.protected ICommand<IResultListener<E>>notcommandprotected java.util.Queue<Tuple2<IResultListener<E>,ICommand<IResultListener<E>>>>notificationsThe scheduled notifications.protected EresultThe result.protected booleanresultavailableFlag indicating if result is available.static java.lang.ThreadLocal<java.util.Queue<Tuple3<Future<?>,IResultListener<?>,ICommand<IResultListener<?>>>>>STACKNotification stack for unwinding call stack to topmost future.protected booleanundoneThe undone flag.static longUNSETConstant for unset.
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Deprecated Methods Modifier and Type Method Description voidabortGet(ISuspendable caller)Abort a blocking get call.IFuture<java.lang.Void>acceptEither(IFuture<E> other, Consumer<E> action, java.lang.Class<?> futuretype)The given consumer will be executed with either of the result of this and the given other future.voidaddResultListener(IFunctionalResultListener<E> sucListener)Add an functional result listener, which is only called on success.voidaddResultListener(IFunctionalResultListener<E> sucListener, IFunctionalExceptionListener exListener)Add a result listener by combining an OnSuccessListener and an OnExceptionListener.voidaddResultListener(IResultListener<E> listener)Add a result listener.<U> IFuture<U>applyToEither(IFuture<E> other, Function<E,U> fn, java.lang.Class<?> futuretype)The given function will be executed with either of the result of this and the given other future.voiddelegate(Future<E> target)protected booleandoSetException(java.lang.Exception exception, boolean undone)Set the exception (internal implementation for normal and if-undone).protected booleandoSetResult(E result, boolean undone)Set the result without notifying listeners.IFuture<E>exceptionally(Consumer<? super java.lang.Exception> consumer)IFuture<E>exceptionally(Consumer<? super java.lang.Exception> consumer, java.lang.Class<?> futuretype)<T> voidexceptionally(Future<T> delegate)Sequential execution of async methods via implicit delegation.protected voidexecuteNotification(IResultListener<E> listener, ICommand<IResultListener<E>> command)Execute a notification.Eget()Get the result - blocking call.Eget(boolean realtime)Get the result - blocking call.Eget(long timeout)Get the result - blocking call.Eget(long timeout, boolean realtime)Get the result - blocking call.Eget(ThreadSuspendable sus)Deprecated.- From 3.0.static <T> IFuture<T>getEmptyFuture()Get the empty future of some type.java.lang.ExceptiongetException()Get the exception, if any.<T> Future<T>getFuture(java.lang.Class<?> futuretype)Sequential execution of async methods via implicit delegation.protected ICommand<IResultListener<E>>getNotificationCommand()Get the notification command.booleanhasResultListener()Check, if the future has at least one listener.booleanisDone()Test if done, i.e.protected voidnotifyListener()Notify all result listeners of the finished future (result or exception).protected voidnotifyListener(IResultListener<E> listener)Notify a specific result listener of the finished future (result or exception).protected voidresume()Resume after result or exception has been set.protected voidscheduleNotification(IResultListener<E> listener, ICommand<IResultListener<E>> command)Schedule a listener notification for a specific listener.protected voidscheduleNotification(ICommand<IResultListener<E>> command)Schedule a notification for all listeners.protected voidscheduleNotification(IFilter<IResultListener<E>> filter, ICommand<IResultListener<E>> command)Schedule a listener notification.voidsendForwardCommand(java.lang.Object command)Send a (forward) command to the listeners.voidsetException(java.lang.Exception exception)Set the exception.booleansetExceptionIfUndone(java.lang.Exception exception)Set the exception.voidsetResult(E result)Set the result.booleansetResultIfUndone(E result)Set the result.protected voidstartScheduledNotifications()Start scheduled listener notifications.IFuture<java.lang.Void>thenAccept(Consumer<? super E> consumer)Applies a synchronous function consuming the result after it is available.IFuture<java.lang.Void>thenAccept(Consumer<? super E> consumer, java.lang.Class<?> futuretype)Applies a function consuming the result after it is available.<T> IFuture<T>thenApply(Function<? super E,? extends T> function)Applies a function after the result is available, using the result of this Future as input.<T> IFuture<T>thenApply(Function<? super E,? extends T> function, java.lang.Class<?> futuretype)Applies a function after the result is available, using the result of this Future as input.<U,V>
IFuture<V>thenCombine(IFuture<U> other, BiFunction<? super E,? super U,? extends V> function, java.lang.Class<?> futuretype)Combines this and another future and uses the given bifunction to calculate the result.<T> IFuture<T>thenCompose(Function<? super E,IFuture<T>> function)The result of this future is delegated to the given (future-returning) function.<T> IFuture<T>thenCompose(Function<? super E,IFuture<T>> function, java.lang.Class<?> futuretype)The result of this future is delegated to the given (future-returning) function.
-
-
-
Field Detail
-
STACK
public static final java.lang.ThreadLocal<java.util.Queue<Tuple3<Future<?>,IResultListener<?>,ICommand<IResultListener<?>>>>> STACK
Notification stack for unwinding call stack to topmost future.
-
CALLER_QUEUED
protected static final java.lang.String CALLER_QUEUED
A caller is queued for suspension.- See Also:
- Constant Field Values
-
CALLER_RESUMED
protected static final java.lang.String CALLER_RESUMED
A caller is resumed.- See Also:
- Constant Field Values
-
CALLER_SUSPENDED
protected static final java.lang.String CALLER_SUSPENDED
A caller is suspended.- See Also:
- Constant Field Values
-
DEBUG
public static boolean DEBUG
Debug flag.
-
NO_STACK_COMPACTION
public static boolean NO_STACK_COMPACTION
Disable Stack unfolding for easier debugging.
-
NONE
public static final long NONE
Constant for no timeout.- See Also:
- Constant Field Values
-
UNSET
public static final long UNSET
Constant for unset.- See Also:
- Constant Field Values
-
result
protected E result
The result.
-
exception
protected java.lang.Exception exception
The exception (if any).
-
resultavailable
protected volatile boolean resultavailable
Flag indicating if result is available.
-
callers
protected java.util.Map<ISuspendable,java.lang.String> callers
The blocked callers (caller->state).
-
listener
protected IResultListener<E> listener
The first listener (for avoiding array creation).
-
listeners
protected java.util.List<IResultListener<E>> listeners
The listeners.
-
creation
protected java.lang.Exception creation
For capturing call stack of future creation.
-
first
protected java.lang.Exception first
For capturing call stack of first setResult/Exception call.
-
undone
protected boolean undone
The undone flag.
-
notifications
protected java.util.Queue<Tuple2<IResultListener<E>,ICommand<IResultListener<E>>>> notifications
The scheduled notifications.
-
notcommand
protected ICommand<IResultListener<E>> notcommand
-
-
Constructor Detail
-
Future
public Future()
Create a new future.
-
Future
public Future(E result)
Create a future that is already done.- Parameters:
result- The result, if any.
-
Future
public Future(java.lang.Exception exception)
Create a future that is already failed.- Parameters:
exception- The exception.
-
-
Method Detail
-
getEmptyFuture
public static <T> IFuture<T> getEmptyFuture()
Get the empty future of some type.- Returns:
- The empty future.
-
isDone
public boolean isDone()
Test if done, i.e. result is available.
-
getException
public java.lang.Exception getException()
Get the exception, if any.- Specified by:
getExceptionin interfaceIFuture<E>- Returns:
- The exception, if any, or null if the future is not yet done or succeeded without exception.
-
get
public E get(ThreadSuspendable sus)
Deprecated.- From 3.0. Use the version without suspendable. Will NOT use the suspendable given as parameter. Get the result - blocking call.
-
get
public E get()
Get the result - blocking call.
-
get
public E get(boolean realtime)
Get the result - blocking call.
-
get
public E get(long timeout)
Get the result - blocking call.
-
get
public E get(long timeout, boolean realtime)
Get the result - blocking call.
-
doSetException
protected boolean doSetException(java.lang.Exception exception, boolean undone)Set the exception (internal implementation for normal and if-undone).
-
setException
public void setException(java.lang.Exception exception)
Set the exception. Listener notifications occur on calling thread of this method.- Parameters:
exception- The exception.
-
setExceptionIfUndone
public boolean setExceptionIfUndone(java.lang.Exception exception)
Set the exception. Listener notifications occur on calling thread of this method.- Parameters:
exception- The exception.
-
setResult
public void setResult(E result)
Set the result. Listener notifications occur on calling thread of this method.- Parameters:
result- The result.
-
setResultIfUndone
public boolean setResultIfUndone(E result)
Set the result. Listener notifications occur on calling thread of this method.- Parameters:
result- The result.- Returns:
- True if result was set.
-
doSetResult
protected boolean doSetResult(E result, boolean undone)
Set the result without notifying listeners.
-
resume
protected void resume()
Resume after result or exception has been set.
-
abortGet
public void abortGet(ISuspendable caller)
Abort a blocking get call.
-
scheduleNotification
protected void scheduleNotification(IFilter<IResultListener<E>> filter, ICommand<IResultListener<E>> command)
Schedule a listener notification.- Parameters:
filter- Optional filter to select only specific listener (e.g. for forward commands). Otherwise uses all listeners.command- The notification command to execute for each selected listener.
-
scheduleNotification
protected void scheduleNotification(ICommand<IResultListener<E>> command)
Schedule a notification for all listeners.- Parameters:
command- The notification command to execute for each currently registered listener.
-
scheduleNotification
protected void scheduleNotification(IResultListener<E> listener, ICommand<IResultListener<E>> command)
Schedule a listener notification for a specific listener. Can be called from synchronized block.- Parameters:
listener- The listener to notify.command- The notification command to execute for the listener.
-
startScheduledNotifications
protected final void startScheduledNotifications()
Start scheduled listener notifications. Must not be called from synchronized block.
-
executeNotification
protected void executeNotification(IResultListener<E> listener, ICommand<IResultListener<E>> command)
Execute a notification. Override for scheduling on other threads.
-
addResultListener
public void addResultListener(IFunctionalResultListener<E> sucListener)
Add an functional result listener, which is only called on success. Exceptions will be handled by DefaultResultListener.- Specified by:
addResultListenerin interfaceIFuture<E>- Parameters:
sucListener- The listener.
-
addResultListener
public void addResultListener(IFunctionalResultListener<E> sucListener, IFunctionalExceptionListener exListener)
Add a result listener by combining an OnSuccessListener and an OnExceptionListener.- Specified by:
addResultListenerin interfaceIFuture<E>- Parameters:
sucListener- The listener that is called on success.exListener- The listener that is called on exceptions. Passingnullenables default exception logging.
-
addResultListener
public void addResultListener(IResultListener<E> listener)
Add a result listener.- Specified by:
addResultListenerin interfaceIFuture<E>- Parameters:
listener- The listener.
-
notifyListener
protected void notifyListener()
Notify all result listeners of the finished future (result or exception).
-
notifyListener
protected void notifyListener(IResultListener<E> listener)
Notify a specific result listener of the finished future (result or exception).- Parameters:
listener- The listener.
-
getNotificationCommand
protected ICommand<IResultListener<E>> getNotificationCommand()
Get the notification command.
-
sendForwardCommand
public void sendForwardCommand(java.lang.Object command)
Send a (forward) command to the listeners.- Specified by:
sendForwardCommandin interfaceIForwardCommandFuture- Parameters:
command- The command.
-
hasResultListener
public boolean hasResultListener()
Check, if the future has at least one listener.
-
thenApply
public <T> IFuture<T> thenApply(Function<? super E,? extends T> function)
Description copied from interface:IFutureApplies a function after the result is available, using the result of this Future as input.
-
thenApply
public <T> IFuture<T> thenApply(Function<? super E,? extends T> function, java.lang.Class<?> futuretype)
Description copied from interface:IFutureApplies a function after the result is available, using the result of this Future as input.
-
thenCompose
public <T> IFuture<T> thenCompose(Function<? super E,IFuture<T>> function)
Description copied from interface:IFutureThe result of this future is delegated to the given (future-returning) function. The result of the function will be available in the returned future.- Specified by:
thenComposein interfaceIFuture<E>- Parameters:
function- Function that takes the result of this future as input and delivers future(t).- Returns:
- Future of the result of the second async call.
-
thenCompose
public <T> IFuture<T> thenCompose(Function<? super E,IFuture<T>> function, java.lang.Class<?> futuretype)
Description copied from interface:IFutureThe result of this future is delegated to the given (future-returning) function. The result of the function will be available in the returned future.- Specified by:
thenComposein interfaceIFuture<E>- Parameters:
function- Function that takes the result of this future as input and delivers future(t).futuretype- The type of the return future. If null, a default future is created.- Returns:
- Future of the result of the second async call.
-
thenAccept
public IFuture<java.lang.Void> thenAccept(Consumer<? super E> consumer)
Description copied from interface:IFutureApplies a synchronous function consuming the result after it is available.- Specified by:
thenAcceptin interfaceIFuture<E>- Parameters:
consumer- Consumer that takes the result of this future as input and consumes it.- Returns:
- Future of the result of the second async call.
-
thenAccept
public IFuture<java.lang.Void> thenAccept(Consumer<? super E> consumer, java.lang.Class<?> futuretype)
Description copied from interface:IFutureApplies a function consuming the result after it is available.- Specified by:
thenAcceptin interfaceIFuture<E>- Parameters:
consumer- Consumer that takes the result of this future as input and consumes it.futuretype- The type of the return future. If null, a default future is created.- Returns:
- Future of the second async call (returning void).
-
thenCombine
public <U,V> IFuture<V> thenCombine(IFuture<U> other, BiFunction<? super E,? super U,? extends V> function, java.lang.Class<?> futuretype)
Description copied from interface:IFutureCombines this and another future and uses the given bifunction to calculate the result. Both future results are passed to the function as input.- Specified by:
thenCombinein interfaceIFuture<E>function- BiFunction that takes the result of this and given other future as input and produces output.futuretype- The type of the return future. If null, a default future is created.- Returns:
- Future of the second async call. Types: function is: E,U -> V
-
applyToEither
public <U> IFuture<U> applyToEither(IFuture<E> other, Function<E,U> fn, java.lang.Class<?> futuretype)
Description copied from interface:IFutureThe given function will be executed with either of the result of this and the given other future. The returned Future will receive the result of the function execution. If both futures return results, the first is used to call the function. If both futures throw exceptions, the last is passed to the returned future.- Specified by:
applyToEitherin interfaceIFuture<E>- Parameters:
other- other futurefn- function to receive resultfuturetype- The type of the return future. If null, a default future is created.- Returns:
- Future of the async function execution.
-
acceptEither
public IFuture<java.lang.Void> acceptEither(IFuture<E> other, Consumer<E> action, java.lang.Class<?> futuretype)
Description copied from interface:IFutureThe given consumer will be executed with either of the result of this and the given other future. The returned Future will receive the result of the function execution. If both futures return results, the first is used to call the function. If both futures throw exceptions, the last is passed to the returned future.- Specified by:
acceptEitherin interfaceIFuture<E>- Parameters:
other- other futurefuturetype- The type of the return future. If null, a default future is created.- Returns:
- Future of the async function execution.
-
exceptionally
public <T> void exceptionally(Future<T> delegate)
Sequential execution of async methods via implicit delegation.- Specified by:
exceptionallyin interfaceIFuture<E>- Parameters:
function- Function that takes the result of this future as input and delivers future(t).ret- The
-
exceptionally
public IFuture<E> exceptionally(Consumer<? super java.lang.Exception> consumer)
- Specified by:
exceptionallyin interfaceIFuture<E>
-
exceptionally
public IFuture<E> exceptionally(Consumer<? super java.lang.Exception> consumer, java.lang.Class<?> futuretype)
- Specified by:
exceptionallyin interfaceIFuture<E>
-
getFuture
public <T> Future<T> getFuture(java.lang.Class<?> futuretype)
Sequential execution of async methods via implicit delegation.- Parameters:
futuretype- The type of the result future (cannot be automatically determined).- Returns:
- Future of the result of the second async call.
-
-