public abstract class Scheduler
extends java.lang.Object
Scheduler
is an object that specifies an API for scheduling
units of work with or without delays or periodically.
You can get common instances of this class in Schedulers
.Modifier and Type | Class and Description |
---|---|
static class |
Scheduler.Worker
Sequential Scheduler for executing actions on a single thread or event loop.
|
Constructor and Description |
---|
Scheduler() |
Modifier and Type | Method and Description |
---|---|
static long |
clockDriftTolerance()
Returns the clock drift tolerance in nanoseconds.
|
abstract Scheduler.Worker |
createWorker()
Retrieves or creates a new
Scheduler.Worker that represents serial execution of actions. |
long |
now(java.util.concurrent.TimeUnit unit)
Returns the 'current time' of the Scheduler in the specified time unit.
|
Disposable |
scheduleDirect(java.lang.Runnable run)
Schedules the given task on this scheduler non-delayed execution.
|
Disposable |
scheduleDirect(java.lang.Runnable run,
long delay,
java.util.concurrent.TimeUnit unit)
Schedules the execution of the given task with the given delay amount.
|
Disposable |
schedulePeriodicallyDirect(java.lang.Runnable run,
long initialDelay,
long period,
java.util.concurrent.TimeUnit unit)
Schedules a periodic execution of the given task with the given initial delay and period.
|
void |
shutdown()
Instructs the Scheduler instance to stop threads
and stop accepting tasks on any outstanding Workers.
|
void |
start()
Allows the Scheduler instance to start threads
and accept tasks on them.
|
<S extends Scheduler & Disposable> |
when(Function<Flowable<Flowable<Completable>>,Completable> combine)
Allows the use of operators for controlling the timing around when
actions scheduled on workers are actually done.
|
public static long clockDriftTolerance()
Related system property: rx2.scheduler.drift-tolerance
in minutes
@NonNull public abstract Scheduler.Worker createWorker()
Scheduler.Worker
that represents serial execution of actions.
When work is completed it should be unsubscribed using Disposable.dispose()
.
Work on a Scheduler.Worker
is guaranteed to be sequential.
public long now(@NonNull java.util.concurrent.TimeUnit unit)
unit
- the time unitpublic void start()
Implementations should make sure the call is idempotent and thread-safe.
public void shutdown()
Implementations should make sure the call is idempotent and thread-safe.
@NonNull public Disposable scheduleDirect(@NonNull java.lang.Runnable run)
This method is safe to be called from multiple threads but there are no ordering guarantees between tasks.
run
- the task to execute@NonNull public Disposable scheduleDirect(@NonNull java.lang.Runnable run, long delay, @NonNull java.util.concurrent.TimeUnit unit)
This method is safe to be called from multiple threads but there are no ordering guarantees between tasks.
run
- the task to scheduledelay
- the delay amount, non-positive values indicate non-delayed schedulingunit
- the unit of measure of the delay amount@NonNull public Disposable schedulePeriodicallyDirect(@NonNull java.lang.Runnable run, long initialDelay, long period, @NonNull java.util.concurrent.TimeUnit unit)
This method is safe to be called from multiple threads but there are no ordering guarantees between tasks.
The periodic execution is at a fixed rate, that is, the first execution will be after the initial delay, the second after initialDelay + period, the third after initialDelay + 2 * period, and so on.
run
- the task to scheduleinitialDelay
- the initial delay amount, non-positive values indicate non-delayed schedulingperiod
- the period at which the task should be re-executedunit
- the unit of measure of the delay amount@NonNull public <S extends Scheduler & Disposable> S when(@NonNull Function<Flowable<Flowable<Completable>>,Completable> combine)
Scheduler
. The only parameter
is a function that flattens an Flowable
of Flowable
of Completable
s into just one Completable
. There must be
a chain of operators connecting the returned value to the source
Flowable
otherwise any work scheduled on the returned
Scheduler
will not be executed.
When createWorker()
is invoked a Flowable
of
Completable
s is onNext'd to the combinator to be flattened. If
the inner Flowable
is not immediately subscribed to an calls to
Scheduler.Worker.schedule(java.lang.Runnable)
are buffered. Once the Flowable
is
subscribed to actions are then onNext'd as Completable
s.
Finally the actions scheduled on the parent Scheduler
when the
inner most Completable
s are subscribed to.
When the Scheduler.Worker
is unsubscribed the Completable
emits an
onComplete and triggers any behavior in the flattening operator. The
Flowable
and all Completable
s give to the flattening
function never onError.
Limit the amount concurrency two at a time without creating a new fix size thread pool:
Scheduler limitScheduler = Schedulers.computation().when(workers -> { // use merge max concurrent to limit the number of concurrent // callbacks two at a time return Completable.merge(Flowable.merge(workers), 2); });
This is a slightly different way to limit the concurrency but it has some
interesting benefits and drawbacks to the method above. It works by
limited the number of concurrent Scheduler.Worker
s rather than individual
actions. Generally each Flowable
uses its own Scheduler.Worker
.
This means that this will essentially limit the number of concurrent
subscribes. The danger comes from using operators like
Flowable.zip(org.reactivestreams.Publisher, org.reactivestreams.Publisher, io.reactivex.functions.BiFunction)
where
subscribing to the first Flowable
could deadlock the
subscription to the second.
Scheduler limitScheduler = Schedulers.computation().when(workers -> { // use merge max concurrent to limit the number of concurrent // Flowables two at a time return Completable.merge(Flowable.merge(workers, 2)); });Slowing down the rate to no more than than 1 a second. This suffers from the same problem as the one above I could find an
Flowable
operator that limits the rate without dropping the values (aka leaky
bucket algorithm).
Scheduler slowScheduler = Schedulers.computation().when(workers -> { // use concatenate to make each worker happen one at a time. return Completable.concat(workers.map(actions -> { // delay the starting of the next worker by 1 second. return Completable.merge(actions.delaySubscription(1, TimeUnit.SECONDS)); })); });
S
- a Scheduler and a Subscriptioncombine
- the function that takes a two-level nested Flowable sequence of a Completable and returns
the Completable that will be subscribed to and should trigger the execution of the scheduled Actions.