public class Select<I,O> extends CoroutineStep<I,O>
when(Predicate)
. If a result is selected all coroutines that are sill
running will be cancelled and execution of the selecting coroutine is
resumed.
The main purpose of this step is to non-blockingly select the first result from other suspending coroutines although it can be used with arbitrary coroutines and steps. It should be noted that if both suspending and non-suspending selection targets are used the non-suspending targets will almost always be selected. Even when using only suspending coroutines the selection will be slightly biased towards the first coroutine because the coroutines need to be launched sequentially, giving the first coroutine(s) a head start.
To select more than one result from the child coroutines the related step
implementation Collect
can be used.
Constructor and Description |
---|
Select(java.util.Collection<Coroutine<? super I,? extends O>> rFromCoroutines)
Creates a new instance.
|
Modifier and Type | Method and Description |
---|---|
protected O |
execute(I rInput,
Continuation<?> rContinuation)
This method must be implemented by subclasses to provide the actual
functionality of this step.
|
Select<I,O> |
or(Coroutine<? super I,? extends O> rCoroutine)
Creates a new instance that selects from an additional coroutine.
|
Select<I,O> |
or(CoroutineStep<? super I,? extends O> rStep)
Creates a new instance that selects from an additional step.
|
void |
runAsync(java.util.concurrent.CompletableFuture<I> fPreviousExecution,
CoroutineStep<O,?> rNextStep,
Continuation<?> rContinuation)
Runs this execution step asynchronously as a continuation of a previous
code execution in a
CompletableFuture and proceeds to the next
step afterwards. |
static <I,O> Select<I,O> |
select(Coroutine<? super I,? extends O>... rFromCoroutines)
Suspends the coroutine execution until one coroutine finishes and then
resumes the execution with the result.
|
static <I,O> Select<I,O> |
select(CoroutineStep<? super I,? extends O>... rFromSteps)
Suspends the coroutine execution until one coroutine step finishes.
|
Select<I,O> |
when(java.util.function.Predicate<Continuation<?>> pSelectCriteria)
Adds a condition for the result selection.
|
fail, runBlocking, terminateCoroutine, toString
deleteRelation, get, getRelation, getRelations, notifyRelationListeners, readRelations, relationsEqual, relationsHashCode, relationsString, set, set, transform, writeRelations
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
@SafeVarargs public static <I,O> Select<I,O> select(Coroutine<? super I,? extends O>... rFromCoroutines)
when(Predicate)
which will
return a new Select
instance. Modified instances that select from
additional coroutines or steps can be created with or(Coroutine)
and or(CoroutineStep)
.rFromCoroutines
- The coroutines to select from@SafeVarargs public static <I,O> Select<I,O> select(CoroutineStep<? super I,? extends O>... rFromSteps)
select(Coroutine...)
.rFromSteps
- The coroutine steps to select frompublic Select<I,O> or(Coroutine<? super I,? extends O> rCoroutine)
rCoroutine
- The additional coroutine to select frompublic Select<I,O> or(CoroutineStep<? super I,? extends O> rStep)
or(Coroutine)
.rStep
- The additional step to select frompublic void runAsync(java.util.concurrent.CompletableFuture<I> fPreviousExecution, CoroutineStep<O,?> rNextStep, Continuation<?> rContinuation)
CompletableFuture
and proceeds to the next
step afterwards.
Subclasses that need to suspend the invocation of the next step until
some condition is met (e.g. sending or receiving data has finished) need
to override this method and create a Suspension
by invoking
Continuation.suspend(CoroutineStep, CoroutineStep)
on the next
step. If the condition that caused the suspension resolves the coroutine
execution can be resumed by calling Suspension.resume(Object)
.
Subclasses that override this method also need to handle errors by
terminating any further execution (i.e. not resuming a suspension if such
exists) and forwarding the causing exception to Continuation.fail(Throwable)
.
runAsync
in class CoroutineStep<I,O>
fPreviousExecution
- The future of the previous code executionrNextStep
- The next step to execute or NULL for nonerContinuation
- The continuation of the executionpublic Select<I,O> when(java.util.function.Predicate<Continuation<?>> pSelectCriteria)
pSelectCriteria
- A condition that checks if a result should be
selectedprotected O execute(I rInput, Continuation<?> rContinuation)
execute
in class CoroutineStep<I,O>
rInput
- The input valuerContinuation
- The continuation of the execution