Class IntermediateFuture<E>

    • Field Detail

      • results

        protected java.util.List<E> results
        The intermediate results.
      • intermediate

        protected boolean intermediate
        Flag indicating that addIntermediateResult()has been called.
      • icallers

        protected java.util.Map<ISuspendable,​java.lang.String> icallers
        The blocked intermediate callers (caller->state).
      • indices

        protected java.util.Map<java.lang.Thread,​java.lang.Integer> indices
        The index of the next result for a thread.
      • maxresultcnt

        protected int maxresultcnt
        The max result count (if given by the producer).
    • Constructor Detail

      • IntermediateFuture

        public IntermediateFuture()
        Create a future that is already done.
        Parameters:
        result - The result, if any.
      • IntermediateFuture

        public IntermediateFuture​(java.util.Collection<E> results)
        Create a future that is already done.
        Parameters:
        result - The result, if any.
      • IntermediateFuture

        public IntermediateFuture​(java.lang.Exception exception)
        Create a future that is already done (failed).
        Parameters:
        exception - The exception.
    • Method Detail

      • getIntermediateResults

        public java.util.Collection<E> getIntermediateResults()
        Get the intermediate results that are available.
        Specified by:
        getIntermediateResults in interface IIntermediateFuture<E>
        Returns:
        The current intermediate results (copy of the list).
      • addIntermediateResult

        public void addIntermediateResult​(E result)
        Add an intermediate result.
      • addIntermediateResultIfUndone

        public boolean addIntermediateResultIfUndone​(E result)
        Set the result.
        Parameters:
        result - The result.
        Returns:
        True if result was set.
      • doAddIntermediateResult

        protected boolean doAddIntermediateResult​(E result,
                                                  boolean undone)
        Set the result and schedule listener notifications.
        Returns:
        true, when the result was added (finished and undone otherwise).
      • storeResult

        protected void storeResult​(E result,
                                   boolean scheduled)
        Add a result.
        Parameters:
        result - The result.
        scheduled - True, if any listener notification has been scheduled for this result. (used for subscription futures to check for lost values)
      • doSetResult

        protected boolean doSetResult​(java.util.Collection<E> result,
                                      boolean undone)
        Set the result. Listener notifications occur on calling thread of this method.
        Overrides:
        doSetResult in class Future<java.util.Collection<E>>
        Parameters:
        result - The result.
      • setFinished

        public void setFinished()
        Declare that the future is finished.
      • setFinishedIfUndone

        public boolean setFinishedIfUndone()
        Declare that the future is finished.
      • doSetFinished

        protected boolean doSetFinished​(boolean undone)
        Declare that the future is finished.
      • doSetException

        protected boolean doSetException​(java.lang.Exception exception,
                                         boolean undone)
        Description copied from class: Future
        Set the exception (internal implementation for normal and if-undone).
        Overrides:
        doSetException in class Future<java.util.Collection<E>>
      • hasNextIntermediateResult

        public boolean hasNextIntermediateResult()
        Check if there are more results for iteration for the given caller. If there are currently no unprocessed results and future is not yet finished, the caller is blocked until either new results are available and true is returned or the future is finished, thus returning false.
        Specified by:
        hasNextIntermediateResult in interface IIntermediateFuture<E>
        Returns:
        True, when there are more intermediate results for the caller.
      • hasNextIntermediateResult

        public boolean hasNextIntermediateResult​(long timeout,
                                                 boolean realtime)
        Check if there are more results for iteration for the given caller. If there are currently no unprocessed results and future is not yet finished, the caller is blocked until either new results are available and true is returned or the future is finished, thus returning false.
        Specified by:
        hasNextIntermediateResult in interface IIntermediateFuture<E>
        Parameters:
        timeout - The timeout in millis.
        realtime - Flag, if wait should be realtime (in constrast to simulation time).
        Returns:
        True, when there are more intermediate results for the caller.
      • getNextIntermediateResult

        public E getNextIntermediateResult()
        Iterate over the intermediate results in a blocking fashion. Manages results independently for different callers, i.e. when called from different threads, each thread receives all intermediate results. The operation is guaranteed to be non-blocking, if hasNextIntermediateResult() has returned true before for the same caller. Otherwise the caller is blocked until a result is available or the future is finished.
        Specified by:
        getNextIntermediateResult in interface IIntermediateFuture<E>
        Returns:
        The next intermediate result.
      • getNextIntermediateResult

        public E getNextIntermediateResult​(boolean realtime)
        Iterate over the intermediate results in a blocking fashion. Manages results independently for different callers, i.e. when called from different threads, each thread receives all intermediate results. The operation is guaranteed to be non-blocking, if hasNextIntermediateResult() has returned true before for the same caller. Otherwise the caller is blocked until a result is available or the future is finished.
        Returns:
        The next intermediate result.
      • getNextIntermediateResult

        public E getNextIntermediateResult​(long timeout,
                                           boolean realtime)
        Iterate over the intermediate results in a blocking fashion. Manages results independently for different callers, i.e. when called from different threads, each thread receives all intermediate results. The operation is guaranteed to be non-blocking, if hasNextIntermediateResult() has returned true before for the same caller. Otherwise the caller is blocked until a result is available or the future is finished.
        Specified by:
        getNextIntermediateResult in interface IIntermediateFuture<E>
        Parameters:
        timeout - The timeout in millis.
        realtime - Flag, if wait should be realtime (in constrast to simulation time).
        Returns:
        The next intermediate result.
      • setMaxResultCount

        public void setMaxResultCount​(int max)
        Set the maximum number of results.
        Parameters:
        max - The maximum number of results.
      • scheduleMaxNotification

        protected boolean scheduleMaxNotification​(IResultListener<java.util.Collection<E>> lis)
        Parameters:
        max -
      • getResultCount

        protected int getResultCount()
        Get the number of results already collected.
        Returns:
        The number of results.
      • doGetNextIntermediateResult

        protected E doGetNextIntermediateResult​(int index,
                                                long timeout,
                                                boolean realtime)
        Perform the get without increasing the index.
      • notifyIntermediateResult

        protected void notifyIntermediateResult​(IIntermediateResultListener<E> listener,
                                                E result)
        Notify a result listener.
        Parameters:
        listener - The listener.
      • resume

        protected void resume()
        Resume also intermediate waiters.
        Overrides:
        resume in class Future<java.util.Collection<E>>
      • resumeIntermediate

        protected void resumeIntermediate()
        Resume after intermediate result.
      • delegateFrom

        public void delegateFrom​(IFuture<java.util.Collection<E>> source)
        Delegate the result and exception from another future.
        Overrides:
        delegateFrom in class Future<java.util.Collection<E>>
        Parameters:
        source - The source future.
      • catchEx

        public IIntermediateFuture<E> catchEx​(java.util.function.Consumer<? super java.lang.Exception> consumer,
                                              java.lang.Class<?> futuretype)
        Description copied from class: Future
        Called on exception.
        Specified by:
        catchEx in interface IFuture<E>
        Overrides:
        catchEx in class Future<java.util.Collection<E>>
        Parameters:
        consumer - The function called with the exception.
        futuretype - The function called with the exception.
      • delegateEx

        public <T> IIntermediateFuture<E> delegateEx​(Future<T> delegate)
        Called on exception.
        Parameters:
        delegate - The future the exception will be delegated to.
      • then

        public IIntermediateFuture<E> then​(java.util.function.Consumer<? super java.util.Collection<E>> function)
        Description copied from interface: IFuture
        Applies a function after the result is available, using the result of this Future as input.
        Specified by:
        then in interface IFuture<E>
        Overrides:
        then in class Future<java.util.Collection<E>>
        Parameters:
        function - Function that takes the result of this future as input and delivers t.
        Returns:
        Future of the result after the function has been applied.
      • next

        public IIntermediateFuture<? extends E> next​(java.util.function.Consumer<? super E> function)
        Called when the next intermediate value is available.
        Specified by:
        next in interface IIntermediateFuture<E>
        Parameters:
        function - Called when value arrives.
        Returns:
        The future for chaining.
      • max

        public IIntermediateFuture<? extends E> max​(java.util.function.Consumer<java.lang.Integer> function)
        Called when the maximum number of results is available.
        Specified by:
        max in interface IIntermediateFuture<E>
        Parameters:
        function - Called when max value arrives.
        Returns:
        The future for chaining.
      • finished

        public IIntermediateFuture<? extends E> finished​(java.util.function.Consumer<java.lang.Void> function)
        Called when the future is finished.
        Specified by:
        finished in interface IIntermediateFuture<E>
        Parameters:
        function - Called when max value arrives.
        Returns:
        The future for chaining.
      • done

        public IIntermediateFuture<? extends E> done​(java.util.function.Consumer<? super java.lang.Exception> consumer)
        Called when the future is done (finished or exception occurred). Exception parameter will be set if the cause was an exception, null otherwise.
        Specified by:
        done in interface IIntermediateFuture<E>
        Parameters:
        consumer - Called future is done.
        Returns:
        The future for chaining.
      • asStream

        public java.util.stream.Stream<E> asStream()
        Return a stream of the results of this future. Although this method itself is non-blocking, all terminal stream methods (e.g. forEach) will block until the future is finished!
        Specified by:
        asStream in interface IIntermediateFuture<E>
      • asStream

        public java.util.stream.Stream<E> asStream​(long timeout,
                                                   boolean realtime)
        Return a stream of the results of this future. Use the given timeout settings when waiting for elements in the stream. Although this method itself is non-blocking, all terminal stream methods (e.g. forEach) will block until the future is finished!
        Specified by:
        asStream in interface IIntermediateFuture<E>
        Parameters:
        timeout - The timeout in millis.
        realtime - Flag, if wait should be realtime (in constrast to simulation time).