akka.actor
Class LightArrayRevolverScheduler

java.lang.Object
  extended by akka.actor.LightArrayRevolverScheduler
All Implemented Interfaces:
Scheduler, java.io.Closeable

public class LightArrayRevolverScheduler
extends java.lang.Object
implements Scheduler, java.io.Closeable

This scheduler implementation is based on a revolving wheel of buckets, like Netty’s HashedWheelTimer, which it advances at a fixed tick rate and dispatches tasks it finds in the current bucket to their respective ExecutionContexts. The tasks are held in TaskHolders, which upon cancellation null out their reference to the actual task, leaving only this shell to be cleaned up when the wheel reaches that bucket next time. This enables the use of a simple linked list to chain the TaskHolders off the wheel.

Also noteworthy is that this scheduler does not obtain a current time stamp when scheduling single-shot tasks, instead it always rounds up the task delay to a full multiple of the TickDuration. This means that tasks are scheduled possibly one tick later than they could be (if checking that “now() + delay <= nextTick” were done).


Nested Class Summary
protected static class LightArrayRevolverScheduler.TaskHolder
          INTERNAL API
protected static interface LightArrayRevolverScheduler.TimerTask
          INTERNAL API
 
Constructor Summary
LightArrayRevolverScheduler(com.typesafe.config.Config config, LoggingAdapter log, java.util.concurrent.ThreadFactory threadFactory)
           
 
Method Summary
protected  long clock()
          Clock implementation is replaceable (for testing); the implementation must return a monotonically increasing series of Long nanoseconds.
 void close()
           
protected  scala.concurrent.duration.FiniteDuration getShutdownTimeout()
          Overridable for tests
 double maxFrequency()
          The maximum supported task frequency of this scheduler, i.e.
 Cancellable schedule(scala.concurrent.duration.FiniteDuration initialDelay, scala.concurrent.duration.FiniteDuration delay, java.lang.Runnable runnable, scala.concurrent.ExecutionContext executor)
          Schedules a function to be run repeatedly with an initial delay and a frequency.
 Cancellable scheduleOnce(scala.concurrent.duration.FiniteDuration delay, java.lang.Runnable runnable, scala.concurrent.ExecutionContext executor)
          Schedules a Runnable to be run once with a delay, i.e.
 scala.concurrent.duration.FiniteDuration ShutdownTimeout()
           
 scala.concurrent.duration.FiniteDuration TickDuration()
           
protected  void waitNanos(long nanos)
          Overridable for tests
 int WheelSize()
           
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 
Methods inherited from interface akka.actor.Scheduler
schedule, schedule, scheduleOnce, scheduleOnce
 

Constructor Detail

LightArrayRevolverScheduler

public LightArrayRevolverScheduler(com.typesafe.config.Config config,
                                   LoggingAdapter log,
                                   java.util.concurrent.ThreadFactory threadFactory)
Method Detail

WheelSize

public int WheelSize()

TickDuration

public scala.concurrent.duration.FiniteDuration TickDuration()

ShutdownTimeout

public scala.concurrent.duration.FiniteDuration ShutdownTimeout()

clock

protected long clock()
Clock implementation is replaceable (for testing); the implementation must return a monotonically increasing series of Long nanoseconds.


getShutdownTimeout

protected scala.concurrent.duration.FiniteDuration getShutdownTimeout()
Overridable for tests


waitNanos

protected void waitNanos(long nanos)
Overridable for tests


schedule

public Cancellable schedule(scala.concurrent.duration.FiniteDuration initialDelay,
                            scala.concurrent.duration.FiniteDuration delay,
                            java.lang.Runnable runnable,
                            scala.concurrent.ExecutionContext executor)
Description copied from interface: Scheduler
Schedules a function to be run repeatedly with an initial delay and a frequency. E.g. if you would like the function to be run after 2 seconds and thereafter every 100ms you would set delay = Duration(2, TimeUnit.SECONDS) and interval = Duration(100, TimeUnit.MILLISECONDS)

Java API

Specified by:
schedule in interface Scheduler

scheduleOnce

public Cancellable scheduleOnce(scala.concurrent.duration.FiniteDuration delay,
                                java.lang.Runnable runnable,
                                scala.concurrent.ExecutionContext executor)
Description copied from interface: Scheduler
Schedules a Runnable to be run once with a delay, i.e. a time period that has to pass before the runnable is executed.

Java & Scala API

Specified by:
scheduleOnce in interface Scheduler

close

public void close()
Specified by:
close in interface java.io.Closeable

maxFrequency

public double maxFrequency()
Description copied from interface: Scheduler
The maximum supported task frequency of this scheduler, i.e. the inverse of the minimum time interval between executions of a recurring task, in Hz.

Specified by:
maxFrequency in interface Scheduler