Fixed-delay & fixed-rate single thread scheduler
The scheduler supports varying scheduling intervals by asking the task
every time for its next preferred scheduling interval. Scheduling can
either be
fixed-delay or
fixed-rate. The notions are
borrowed from
java.util.Timer and retain the same meaning.
I.e. in fixed-delay scheduling, the task's new schedule is calculated
as:
new_schedule = time_task_starts + scheduling_interval
In fixed-rate scheduling, the next schedule is calculated as:
new_schedule = time_task_was_supposed_to_start + scheduling_interval
The scheduler internally holds a queue of tasks sorted in ascending order
according to their next execution time. A task is removed from the queue
if it is cancelled, i.e. if
TimeScheduler.Task.isCancelled()
returns true.
The scheduler internally uses a
java.util.SortedSet to keep tasks
sorted.
java.util.Timer uses an array arranged as a binary heap
that doesn't shrink. It is likely that the latter arrangement is faster.
Initially, the scheduler is in
SUSPENDed mode,
start()
need not be called: if a task is added, the scheduler gets started
automatically. Calling
start() starts the scheduler if it's
suspended or stopped else has no effect. Once
stop() is called,
added tasks will not restart it:
start() has to be called to
restart the scheduler.
add
public void add(TimeScheduler.Task t,
boolean relative)
Add a task for execution at adjustable intervals
t
- the task to executerelative
- scheduling scheme:
true:
Task is rescheduled relative to the last time it actually
started execution
false:
Task is scheduled relative to its last execution schedule. This
has the effect that the time between two consecutive executions of
the task remains the same.
dumpTaskQueue
public String dumpTaskQueue()
getSuspendInterval
public long getSuspendInterval()
setSuspendInterval
public void setSuspendInterval(long s)
size
public int size()
Answers the number of tasks currently in the queue.
- The number of tasks currently in the queue.
start
public void start()
Start the scheduler, if it's suspended or stopped
stop
public void stop()
throws InterruptedException
Stop the scheduler if it's running. Switch to stopped, if it's
suspended. Clear the task queue.