构建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

相关问答

更多

我可以只使用一个位图绘制alpha吗?(Can I draw alpha using just one bitmap?)

实际上,您可以将Alpha级别设置为Paint对象。 例如: Paint transparentpaint = new Paint(); transparentpaint.setAlpha(100); // 0 - 255 canvas.drawBitmap(bitmap, 0, 0, transparentpaint); 尝试粘贴此而不是canvas.drawBitmap(bitmap, 0, 0, null); I played with this for some time and I

自己附加两个ng-repeat(attach two ng-repeat themselves)

有两种方法可以做到这一点。 首先是服务器端:有一个请求返回正确的数据集。 我将专注于客户端,因为它是客户端问题。 我建议你创建一个包含用户和值的列表: var tabuser = JSON.parse(localStorage.getItem("myid")); console.log(tabuser); var urls = []; $scope.data = []; for(i = 0; i < tabuser.length; i++){

毕达哥拉斯检查哈斯克尔(Pythagoras check Haskell)

你的问题并不是真的包含任何问题,但是从你写的内容来看,很明显你正在努力克服Haskell的语法。 我从你的代码中看到的猜测是,你将Haskell的模式匹配语法与命令式语言典型的一系列语句混合在一起。 您要实现的目标可以通过以下方式完成: square :: Int -> Int square x = x*x pyth :: Int -> Int -> Int -> Bool pyth a b c = a' + b' == c' where a' = square a

初学者Android:开发者页面上的片段示例中的R文件会生成意外结果(Beginner Android: R file in Fragment example on Developer page generates unexpected results)

在Android项目中,每次构建项目时,R类都会自动更新或生成。 默认情况下,当您保存更改或按ctrl + s时,eclipse会自动构建或编译代码。 因此,您的资源R的任何更改都会更新。 当你指定新的id,布局,drawable,菜单,字符串,样式等时,android会在你的R类中添加一个引用静态整数。 例: public static final class id { public static final int image=0x7f070001; public stati

当类具有$ 1.class时,Spring无法创建bean(Spring can't created bean when class has $1.class)

为类中的匿名内部类生成MyClass $ 1(和$ 2等等)类。 使用侦听器模式时通常使用匿名内部类,它们的定义如下: MyInterface listener = new MyInterface() { // this is the anonymous inner class ... // implementation } 所以我猜你确实尝试在一个匿名的内部类上使用autowire,我怀疑它不受spring的支持(很难说没有代码)。 MyClass$1 (and $2 and so on