Disruptor 源码分析(2) Disruptor的入口类

[size=medium]Disruptor类是启动类.我们可以通过类似这样构造一个Disruptor对象

ExecutorService exec = Executors.newCachedThreadPool();
Disruptor<ValueEvent> disruptor = new Disruptor<ValueEvent>(ValueEvent.EVENT_FACTORY, 2, exec);


参数解释:
EventFactory 生成Event的工厂,Event就是我们前面说的芝麻.消费者可以通过onEvent方法来处理拿到的芝麻
第二个参数是个数字,这个是生产者和消费者共同使用的数组的大小.
第三个是线程池,消费者是在线程池中启动的.

start方法是启动
shutdown方法是停止生产者使用.

生成者和Disruptor关联起来.
生成者是要首先占位置的,这个位置是通过ringBuffer的next实现的.
生成者ok之后是通过ringBuffer的publish标志那个位置对于消费者可用的.
而ringBuffer的产生就是由Disruptor的start生成的.


消费者和Disruptor关联起来.
首先消费者必须告诉Disruptor如何处理生产者留下了来的任务.说白了就是定义个有onEvent方法的EventHandler类.Disruptor通过handleEventsWith方法来接受EventHandler类.

在Disruptor中sequencer是生产者,consumer是消费者.表示位置信息的类是Sequence
这个时候生成者和消费者看上去 是没有关系的,但是他们都和Disruptor有关系.来看看Disruptor是如何做桥梁的吧.
生成者和消费者要的都只是对方的位置信息.

生成者获取消费者的位置信息
消费者的信息都会写到Disruptor的consumerRepository中去,[/size]

 
public RingBuffer<T> start()
    {
        Sequence[] gatingSequences = consumerRepository.getLastSequenceInChain(true);
        ringBuffer.addGatingSequences(gatingSequences);


getLastSequenceInChain就是获取所有消费者的位置信息.
ringBuffer.addGatingSequences就是把消费者的位置信息引用注入到生产者.


消费者获取生成者的位置信息
消费者是通过SequenceBarrier来管理位置信息的,
final SequenceBarrier barrier = ringBuffer.newBarrier(barrierSequences);
ringBuffer中有生产者的位置信息,存在sequencer中,
这样 SequenceBarrier的cursorSequence就是生产者的位置信息.








猜你喜欢

转载自huangyunbin.iteye.com/blog/1944263