Disruptor 源码分析(7) 不同消费者类型的区别

disruptor不同消费者类型的区别

EventProcessor有3个实现类

BatchEventProcessor 多线程并发执行,不同线程执行不同是不同的event
WorkProcessor 多线程排队领event然后再执行,不同线程执行不同是不同的event.但是多了个排队领event的过程,这个是为了减少对生产者队列查询的压力吧.
NoOpEventProcessor 这个不出来任何事情 我们就不管他了.


WorkProcessor的run方法中有这一段

  do
                    {
                        nextSequence = workSequence.get() + 1L;
                        sequence.set(nextSequence - 1L);
                    }
                    while (!workSequence.compareAndSet(nextSequence - 1L, nextSequence));

可以看到先要获取workSequence,看看workSequence的来源:
在WorkerPool的构造方法中:


for (int i = 0; i < numWorkers; i++)
        {
            workProcessors[i] = new WorkProcessor<T>(ringBuffer,
                                                     sequenceBarrier,
                                                     workHandlers[i],
                                                     exceptionHandler,
                                                     workSequence);
        }


可以看到不同的workProcessors使用的是相同的workSequence.所以要先排一次队.
WorkerPool的start方法中有

 public RingBuffer<T> start(final Executor executor)
        for (WorkProcessor<?> processor : workProcessors)
        {
            executor.execute(processor);

可以看到是多线程的,而且是每一个WorkHandler一个线程.
感觉这里的WorkHandler和EventHandler没区别,都有onEvent方法,只是EventHandler的onEvent多了个sequence.


BatchEventProcessor和前面的WorkProcessor大部分相同,不同的地方是:
1 处理的是EventHandler,后面执行的时候也是一个EventHandler一个线程
2 少了排队取任务的过程,所以线程是并行的.这样多个线程都会同时去检查生产者的位置信息,竞争压力会更大一点.


猜你喜欢

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