Disruptor 源码分析(8) 生产者和消费者默认的等待策略

disruptor生产者和消费者默认的等待策略

生产者和消费者都可能出现速度过快,追上对方的情况,这个时候就需要等待了.等待过程中也会有不同的策略.

生产者的默认策略是BlockingWaitStrategy,是在RingBuffer中确定的.但是生产者的默认实现MultiProducerSequencer没有使用等待策略.


if (wrapPoint > gatingSequence)
                {
                    LockSupport.parkNanos(1); 
                    continue;
                }

生产者是通过 LockSupport.parkNanos(1); 来等待的.


消费者的默认策略是
BatchEventProcessor的run方法


 public void run()
    {
        final long availableSequence = sequenceBarrier.waitFor(nextSequence);


可以看到是由SequenceBarrier来决定的
Disruptor类中
final SequenceBarrier barrier = ringBuffer.newBarrier(barrierSequences);

SequenceBarrier是由ringBuffer决定的


 public SequenceBarrier newBarrier(Sequence... sequencesToTrack)
    {
        return sequencer.newBarrier(sequencesToTrack);
    }


看一看到最后是有sequencer来决定的

 public SequenceBarrier newBarrier(Sequence... sequencesToTrack)
    {
        return new ProcessingSequenceBarrier(this, waitStrategy, cursor, sequencesToTrack);
    }

这里的waitStrategy就是sequencer的waitStrategy.默认的sequencer是MultiProducerSequencer.

 public static <E> RingBuffer<E> createMultiProducer(EventFactory<E> factory, int bufferSize)
    {
        return createMultiProducer(factory, bufferSize, new BlockingWaitStrategy());
    }

MultiProducerSequencer的默认策略是BlockingWaitStrategy.

sequencer其实就是生产者,所以其实消费者的默认策略和生产者是一样的.




猜你喜欢

转载自huangyunbin.iteye.com/blog/1944385
今日推荐