一、disruptor基本概念

https://www.cnblogs.com/haiq/p/4112689.html

二、disruptor入门程序

导入disruptor包

<dependency>
<groupId>com.lmax</groupId>
<artifactId>disruptor</artifactId>
<version>3.3.</version>
</dependency>

实现disruptor的四部操作

1.建立一个工厂Event类,用于创建Event类实例对象

public class OrderEvent {

    private long value;

    public long getValue() {
return value;
} public void setValue(long value) {
this.value = value;
}
}
public class OrderEventFactory implements EventFactory<OrderEvent> {

    @Override
public OrderEvent newInstance() {
return new OrderEvent(); //这个方法就是为了返回空的数据对象Event
}
}

2.创建事件监听类,用于处理数据

import com.lmax.disruptor.EventHandler;

public class OrderEventHandler implements EventHandler<OrderEvent> {

    @Override
public void onEvent(OrderEvent orderEvent, long l, boolean b) throws Exception {
System.out.println("消费者:"+orderEvent.getValue());
}
}

3.实例化Disruptor实例,配置一系列的参数,编写Disruptory核心组件

public static void main(String[] args) {
OrderEventFactory orderEventFactory = new OrderEventFactory();
int ringBufferSize = 1024 * 1024;//指定容器的大小
ExecutorService executorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()); //指定线程,建议使用自定义线程池 /**
* 1.实例化disruptor对象
* 参数一:orderEventFactory 消息(event)工厂对象
* 参数二:ringBufferSize 容器的长度
* 参数三:线程池(建议使用自定义线程池)RejectedExecutionHandler
* 参数四:ProducerType 单生产者还是多生产者
* 参数五:waitStrategy 等待策略
*/
Disruptor<OrderEvent> disruptor = new Disruptor<OrderEvent>(orderEventFactory, ringBufferSize, executorService, ProducerType.SINGLE, new BlockingWaitStrategy()); //2.添加消费者的监听
disruptor.handleEventsWith(new OrderEventHandler()); //3.启动disruptor
disruptor.start(); //4.获取实际存储数据的容器: RingBuffer
RingBuffer<OrderEvent> ringBuffer = disruptor.getRingBuffer(); OrderEventProducer producer = new OrderEventProducer(ringBuffer); ByteBuffer byteBuffer = ByteBuffer.allocate(8); for (long i = 0; i < 100; i++) {
byteBuffer.putLong(0, i);
producer.sendData(byteBuffer);
}
disruptor.shutdown();
executorService.shutdown();
}

4.编写生产者组件,向Disruptor容器中去投递数据 (此步骤对应上述main方法中的4)

import com.lmax.disruptor.RingBuffer;
import java.nio.ByteBuffer; public class OrderEventProducer { private RingBuffer<OrderEvent> ringBuffer; public OrderEventProducer(RingBuffer<OrderEvent> ringBuffer) {
this.ringBuffer = ringBuffer;
} public void sendData(ByteBuffer data) { //1 在生产者发送消息的时候,首先需要从 ringBuffer 中获取一个可用的序号
long sequence = ringBuffer.next();
try {
//2 根据这个序号找到具体的 OrderEvent 元素,草地上获取的OrderEvent对象是一个没有被赋值的空对象
OrderEvent orderEvent = ringBuffer.get(sequence); //3 进行时间赋值处理
orderEvent.setValue(data.getLong(0));
} finally {
//4 提交操作
ringBuffer.publish(sequence);
}
}
}

最新文章

  1. iOS开发之多种Cell高度自适应实现方案的UI流畅度分析
  2. 12款响应式 Lightbox(灯箱)效果插件
  3. ScrollView控件实现屏幕滚动
  4. 关于Java项目打包
  5. Make it run, make it right, make it fast
  6. Fast 迅捷网络 无线路由器FW323的功能设置
  7. 新安装XAMPP,phpMyAdmin错误:#1045 - Access denied for user &#39;root&#39;@&#39;localhost&#39; (using password: NO)
  8. 20169210《Linux内核原理与分析》第四周作业
  9. 从汇编来看c语言之变量
  10. TCP/IP远程访问操作:rwho,rlogin,rcp和rsh
  11. [转]Linux netstat命令详解
  12. 推荐他们认为有用Sublime Text3小工具
  13. Spring初始化ApplicationContext线程托管实际运用架构构思
  14. PS如何批量生成缩略图(方法可以通用其他重复劳动)
  15. AOP之proceedingjoinpoint和joinpoint区别(获取各对象备忘)、动态代理机制及获取原理代理对象、获取Mybatis Mapper接口原始对象
  16. 基于vue项目的组件中导入mui框架初始化滑动等效果时需移除严格模式的问题
  17. 几个NAND/NOR门可以表示一个XOR门?
  18. Chino的数列
  19. 搭建双节点pg_pool+主从postgresql架构
  20. robotframework 赋予临时id

热门文章

  1. if necessary
  2. java高并发之线程池
  3. A4988驱动42步进电机
  4. [LC] 106. Construct Binary Tree from Inorder and Postorder Traversal
  5. scala slick mysql 字段过多 tuple问题
  6. 安装php5.4 mv9 +apache2.2+mysql5.5问题好多。
  7. derby数据库的了解及使用
  8. 安装centos7后不能联网
  9. signals function|KNN|SVM|average linkage|Complete linkage|single linkage
  10. JVM之工具分析