Class SleepingWaitStrategy

java.lang.Object
com.lmax.disruptor.SleepingWaitStrategy
All Implemented Interfaces:
WaitStrategy

public final class SleepingWaitStrategy extends Object implements WaitStrategy
Sleeping strategy that initially spins, then uses a Thread.yield(), and eventually sleep (LockSupport.parkNanos(n)) for the minimum number of nanos the OS and JVM will allow while the EventProcessors are waiting on a barrier.

This strategy is a good compromise between performance and CPU resource. Latency spikes can occur after quiet periods. It will also reduce the impact on the producing thread as it will not need signal any conditional variables to wake up the event handling thread.

  • Field Details

    • DEFAULT_RETRIES

      private static final int DEFAULT_RETRIES
      See Also:
    • DEFAULT_SLEEP

      private static final long DEFAULT_SLEEP
      See Also:
    • retries

      private final int retries
    • sleepTimeNs

      private final long sleepTimeNs
  • Constructor Details

    • SleepingWaitStrategy

      public SleepingWaitStrategy()
    • SleepingWaitStrategy

      public SleepingWaitStrategy(int retries)
    • SleepingWaitStrategy

      public SleepingWaitStrategy(int retries, long sleepTimeNs)
  • Method Details

    • waitFor

      public long waitFor(long sequence, Sequence cursor, Sequence dependentSequence, SequenceBarrier barrier) throws AlertException
      Description copied from interface: WaitStrategy
      Wait for the given sequence to be available. It is possible for this method to return a value less than the sequence number supplied depending on the implementation of the WaitStrategy. A common use for this is to signal a timeout. Any EventProcessor that is using a WaitStrategy to get notifications about message becoming available should remember to handle this case. The BatchEventProcessor explicitly handles this case and will signal a timeout if required.
      Specified by:
      waitFor in interface WaitStrategy
      Parameters:
      sequence - to be waited on.
      cursor - the main sequence from ringbuffer. Wait/notify strategies will need this as it's the only sequence that is also notified upon update.
      dependentSequence - on which to wait.
      barrier - the processor is waiting on.
      Returns:
      the sequence that is available which may be greater than the requested sequence.
      Throws:
      AlertException - if the status of the Disruptor has changed.
    • signalAllWhenBlocking

      public void signalAllWhenBlocking()
      Description copied from interface: WaitStrategy
      Implementations should signal the waiting EventProcessors that the cursor has advanced.
      Specified by:
      signalAllWhenBlocking in interface WaitStrategy
    • applyWaitMethod

      private int applyWaitMethod(SequenceBarrier barrier, int counter) throws AlertException
      Throws:
      AlertException