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.String
CALLER_QUEUED
A caller is queued for suspension.protected static java.lang.String
CALLER_RESUMED
A caller is resumed.protected static java.lang.String
CALLER_SUSPENDED
A caller is suspended.protected java.util.Map<ISuspendable,java.lang.String>
callers
The blocked callers (caller->state).protected java.lang.Exception
creation
For capturing call stack of future creation.static boolean
DEBUG
Debug flag.protected java.lang.Exception
exception
The exception (if any).protected java.lang.Exception
first
For capturing call stack of first setResult/Exception call.protected IResultListener<E>
listener
The first listener (for avoiding array creation).protected java.util.List<IResultListener<E>>
listeners
The listeners.static boolean
NO_STACK_COMPACTION
Disable Stack unfolding for easier debugging.static long
NONE
Constant for no timeout.protected ICommand<IResultListener<E>>
notcommand
protected java.util.Queue<Tuple2<IResultListener<E>,ICommand<IResultListener<E>>>>
notifications
The scheduled notifications.protected E
result
The result.protected boolean
resultavailable
Flag indicating if result is available.static java.lang.ThreadLocal<java.util.Queue<Tuple3<Future<?>,IResultListener<?>,ICommand<IResultListener<?>>>>>
STACK
Notification stack for unwinding call stack to topmost future.protected boolean
undone
The undone flag.static long
UNSET
Constant for unset.
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Deprecated Methods Modifier and Type Method Description void
abortGet(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.void
addResultListener(IFunctionalResultListener<E> sucListener)
Add an functional result listener, which is only called on success.void
addResultListener(IFunctionalResultListener<E> sucListener, IFunctionalExceptionListener exListener)
Add a result listener by combining an OnSuccessListener and an OnExceptionListener.void
addResultListener(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.void
delegate(Future<E> target)
protected boolean
doSetException(java.lang.Exception exception, boolean undone)
Set the exception (internal implementation for normal and if-undone).protected boolean
doSetResult(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> void
exceptionally(Future<T> delegate)
Sequential execution of async methods via implicit delegation.protected void
executeNotification(IResultListener<E> listener, ICommand<IResultListener<E>> command)
Execute a notification.E
get()
Get the result - blocking call.E
get(boolean realtime)
Get the result - blocking call.E
get(long timeout)
Get the result - blocking call.E
get(long timeout, boolean realtime)
Get the result - blocking call.E
get(ThreadSuspendable sus)
Deprecated.- From 3.0.static <T> IFuture<T>
getEmptyFuture()
Get the empty future of some type.java.lang.Exception
getException()
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.boolean
hasResultListener()
Check, if the future has at least one listener.boolean
isDone()
Test if done, i.e. result is available.protected void
notifyListener()
Notify all result listeners of the finished future (result or exception).protected void
notifyListener(IResultListener<E> listener)
Notify a specific result listener of the finished future (result or exception).protected void
resume()
Resume after result or exception has been set.protected void
scheduleNotification(IResultListener<E> listener, ICommand<IResultListener<E>> command)
Schedule a listener notification for a specific listener.protected void
scheduleNotification(ICommand<IResultListener<E>> command)
Schedule a notification for all listeners.protected void
scheduleNotification(IFilter<IResultListener<E>> filter, ICommand<IResultListener<E>> command)
Schedule a listener notification.void
sendForwardCommand(java.lang.Object command)
Send a (forward) command to the listeners.void
setException(java.lang.Exception exception)
Set the exception.boolean
setExceptionIfUndone(java.lang.Exception exception)
Set the exception.void
setResult(E result)
Set the result.boolean
setResultIfUndone(E result)
Set the result.protected void
startScheduledNotifications()
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:
getException
in 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:
addResultListener
in 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:
addResultListener
in interfaceIFuture<E>
- Parameters:
sucListener
- The listener that is called on success.exListener
- The listener that is called on exceptions. Passingnull
enables default exception logging.
-
addResultListener
public void addResultListener(IResultListener<E> listener)
Add a result listener.- Specified by:
addResultListener
in 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:
sendForwardCommand
in 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:IFuture
Applies 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:IFuture
Applies 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:IFuture
The 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:
thenCompose
in 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:IFuture
The 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:
thenCompose
in 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:IFuture
Applies a synchronous function consuming the result after it is available.- Specified by:
thenAccept
in 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:IFuture
Applies a function consuming the result after it is available.- Specified by:
thenAccept
in 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:IFuture
Combines 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:
thenCombine
in 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:IFuture
The 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:
applyToEither
in 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:IFuture
The 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:
acceptEither
in 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:
exceptionally
in 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:
exceptionally
in interfaceIFuture<E>
-
exceptionally
public IFuture<E> exceptionally(Consumer<? super java.lang.Exception> consumer, java.lang.Class<?> futuretype)
- Specified by:
exceptionally
in 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.
-
-