构建Disruptor实例-生产消费模型完成整个入门示例

2019-05-20 23:30|来源: 网路

1、初始化Disruptor,构建Disruptor只要需要以下几个参数

    1 eventFactory: 消息(event)工厂对象

    2 ringBufferSize: 容器的长度

    3 executor: 线程池(建议使用自定义线程池) RejectedExecutionHandler

    4 ProducerType: 单生产者 还是 多生产者

    5 waitStrategy: 等待策略

示例代码:

Disruptor<OrderEvent> disruptor = new Disruptor<>(orderEventFactory,
        ringBufferSize,
        executor,
        ProducerType.SINGLE,
        new BlockingWaitStrategy());


2、初始化好Disruptor之后,通过该对象的handleEventsWith添加消费者的监听

3、然后启动Disruptor实例

4、往RingBuffer中生产数据,完成生产消费模型


具体代码如下:

package com656463.quickstart;

import java.nio.ByteBuffer;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import com.lmax.disruptor.BlockingWaitStrategy;
import com.lmax.disruptor.RingBuffer;
import com.lmax.disruptor.dsl.Disruptor;
import com.lmax.disruptor.dsl.ProducerType;

public class Main {
    public static void main(String[] args) {
        // 参数准备工作
        OrderEventFactory orderEventFactory = new OrderEventFactory();
        int ringBufferSize = 4;
        ExecutorService executor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());

        /**
         * 1 eventFactory: 消息(event)工厂对象
         * 2 ringBufferSize: 容器的长度
         * 3 executor: 线程池(建议使用自定义线程池) RejectedExecutionHandler
         * 4 ProducerType: 单生产者 还是 多生产者
         * 5 waitStrategy: 等待策略
         */
        //1. 实例化disruptor对象
        Disruptor<OrderEvent> disruptor = new Disruptor<>(orderEventFactory,
                ringBufferSize,
                executor,
                ProducerType.SINGLE,
                new BlockingWaitStrategy());

        //2. 添加消费者的监听 (构建disruptor 与 消费者的一个关联关系)
        disruptor.handleEventsWith(new OrderEventHandler());

        //3. 启动disruptor
        disruptor.start();

        //4. 获取实际存储数据的容器: RingBuffer
        RingBuffer<OrderEvent> ringBuffer = disruptor.getRingBuffer();
        OrderEventProducer producer = new OrderEventProducer(ringBuffer);

        ByteBuffer bb = ByteBuffer.allocate(8);
        for (long i = 0; i < 5; i++) {
            bb.putLong(0, i);
            producer.sendData(bb);
        }

        disruptor.shutdown();
        executor.shutdown();

    }
}


整个Disruptor的入门程序完成,接下来深入理解Disruptor核心API

相关问答

更多

在linux下用c语言实现用多进程同步方法演示“生产者-消费者”问题

这个问题需要的知识主要包括: 1 多进程间进行通信; 2 使用同步信号量(semaphore)和互斥信号量(mutex)进行数据保护。 参考代码如下,可以参照注释辅助理解: #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <pthread.h> #include <semaphore.h> #define N 2 // 消费者或者生产者的数目 #define M 10 // 缓冲数目 int in = 0; / ...

java从入门到精通实例版

每次看到这种java从入门到精通的书籍,我都会想,世界上真的有这种书吗?所以只要这样取名的书籍我从来不看,没有意思,另外说到书籍,国内的java入门书籍好一点的真少,我推荐java核心技术第九版,共两卷,有源码,这种书才是好书中的好书。 不好意思,这里只能上传一卷

LMAX Disruptor是怎么工作的

首先我们来懂得一下它供应的编程模子。LMAX的首要目的就是机能。Disruptor使用一个预分配的条目环。这个环足够大,然则有上限,然后不会超出容量。若是环满了,作者会一贯守候,直到最慢的作者提高而腾出空间。 它有一个或多个作者和读者。有一排从旧到新的条目(从左到右)。作者可以在右侧新增条目。每个读者按从左到右的次第读取条目。读者明显不能跳过作者先读取。 我用“读者”庖代“破费者”来防止让人以为条目会被破费失落。但是我们晓得最终一个读者左边的条目是没有用处的。 但凡读者可以并发地自力地读取条目。然 ...

操作系统设计报告总结

实验内容   读者和写者问题:某数据库有一个写进程、多个读进程,它们之间读、写操作的互斥要求是:写进程运行时,其他读、写进程不能对数据库进行操作。读进程之间不互斥,可以同时读数据库。请用信号量及PV操作描述这一组进程的工作过程。   实验目的   实验目的:在LINUX下创建一个控制台进程,该进程应包含n个线程。用这n个线程来表示n个读者或写者。每个线程按相应测试数据文件(后面介绍)的要求进行读写操作。用信号量机制实现读者-写者问题。   读者-写者问题的操作限制:   1)写-写互斥,即不能有两 ...

新手如何入门制作游戏模型

你去找Unity 3D 游戏引擎的教程,去看一看 还有是找3D Max 的教程,看一看,练一练 然后就可以做一些极为简单的了,至于动作不要担心,那里会教你机器人的使用,动作就很轻松出来了,总的来说,制作3D游戏要比2D游戏简单一些。