高性能并发框架Disruptor(三)

241 阅读2分钟

这是我参与 8 月更文挑战的第 15天,活动详情查看: 8月更文挑战

前面两章我们已经说了Disruptor的一些概念性的知识,现在我们说说Disruptor的源码,一种 DSL 风格的 API,用于在环形缓冲区(又名 Builder 模式)周围设置干扰器模式;

通常情况下,我们通过构造函数来创建一个它的对象,官方已经友好提示了,使用ThreadFactory而不是Executor因为 ThreadFactory 在无法构建线程运行生产者时能够报告错误(就是返回异常)。以下是各参数

  • eventFactory – 在环形缓冲区中创建事件的工厂。

  •  ringBufferSize – 环形缓冲区的大小,必须是 2 的幂。

  •  threadFactory – 为处理器创建线程的ThreadFactory(官方推荐使用ThreadFactory创建线程) 。 

  • producerType – 用于环形缓冲区的声明策略。

  •  waitStrategy – 用于环形缓冲区的等待策略

    public Disruptor( final EventFactory eventFactory, final int ringBufferSize, final ThreadFactory threadFactory, final ProducerType producerType, final WaitStrategy waitStrategy)

这个构造方法会调用RingBuffer.create(),在create里使用指定的生产者类型(SINGLE 或 MULTI)创建一个新的环形缓冲区,该值由上面的构造函数传入,也就是说创建一个支持多个事件发布者或者单个事件发布者由我们定义,然后会走不同的逻辑

为了简单进展我们只说单发布者,有兴趣大家可以多发布者,会调用ringbuffer的构造函数,在这里你会看到为什么入参为什么会有那些限制条件的原因

这样创建完后通过disruptor.setDefaultExceptionHandler()来设置默认异常,然后调用handleEventsWithWorkerPool通过线程池来进行处理,如果对事件的处理有什么前置条件,可继续调用.then的方法处理,比如我们因为垃圾回收,可在调用之前清理一下该事件的缓存,然后调用.start()方法;现在开始缓存Disruptro实例,通过饿汉模式来缓存实例,记住在流程的最后我们需要调用shutDown()来关闭,为什么呢,其实这和disruptor没啥太大关系,而是我们在用disruptor的时候调用了线程池了,我们需要关闭线程池,由于我们是处理环形逻辑,别到最后直接关闭,我们应该等待线程池执行完毕然后关闭