//http://ifeve.com/disruptor-getting-started/
public class LongEvent { private long value;public long getValue() { return value; } public void setValue(long value) { this.value = value; }
} 

import com.lmax.disruptor.EventFactory;
// 需要让disruptor为我们创建事件,我们同时还声明了一个EventFactory来实例化Event对象。
public class LongEventFactory implements EventFactory { @Override public Object newInstance() { return new LongEvent(); }
} 
import com.lmax.disruptor.EventHandler;//我们还需要一个事件消费者,也就是一个事件处理器。这个事件处理器简单地把事件中存储的数据打印到终端:
public class LongEventHandler implements EventHandler<LongEvent>  {@Overridepublic void onEvent(LongEvent longEvent, long l, boolean b) throws Exception {System.out.println(longEvent.getValue());      }}

import java.nio.ByteBuffer;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;import com.lmax.disruptor.RingBuffer;
import com.lmax.disruptor.YieldingWaitStrategy;
import com.lmax.disruptor.dsl.Disruptor;
import com.lmax.disruptor.dsl.ProducerType;public class LongEventMain {public static void main(String[] args) throws Exception {//创建缓冲池ExecutorService  executor = Executors.newCachedThreadPool();//创建工厂LongEventFactory factory = new LongEventFactory();//创建bufferSize ,也就是RingBuffer大小,必须是2的N次方int ringBufferSize = 1024 * 1024; // /**//BlockingWaitStrategy 是最低效的策略,但其对CPU的消耗最小并且在各种不同部署环境中能提供更加一致的性能表现WaitStrategy BLOCKING_WAIT = new BlockingWaitStrategy();//SleepingWaitStrategy 的性能表现跟BlockingWaitStrategy差不多,对CPU的消耗也类似,但其对生产者线程的影响最小,适合用于异步日志类似的场景WaitStrategy SLEEPING_WAIT = new SleepingWaitStrategy();//YieldingWaitStrategy 的性能是最好的,适合用于低延迟的系统。在要求极高性能且事件处理线数小于CPU逻辑核心数的场景中,推荐使用此策略;例如,CPU开启超线程的特性WaitStrategy YIELDING_WAIT = new YieldingWaitStrategy();*///创建disruptor// 1.第一个参数为工厂类对象,用于创建一个个的LongEvent,LongEvent是实际的消费数据// 2.第二个参数为缓冲区大小// 3.第三个参数线程池 进行 Disruptor 内部的数据接收处理调度// 4.第四个参数ProducerType.SINGLE 和  ProducerType.MULTI// 5.第五个参数是一种策略:WaitStrategyDisruptor<LongEvent> disruptor = new Disruptor<LongEvent>(factory, ringBufferSize, executor, ProducerType.SINGLE, new YieldingWaitStrategy());// 连接消费事件方法disruptor.handleEventsWith(new LongEventHandler());// 启动disruptor.start();//Disruptor 的事件发布过程是一个两阶段提交的过程://发布事件// 使用该方法获取具体存放数据的容器ringBuffer(环形结构)RingBuffer<LongEvent> ringBuffer = disruptor.getRingBuffer();//     LongEventProducer producer = new LongEventProducer(ringBuffer); LongEventProducerWithTranslator producer = new LongEventProducerWithTranslator(ringBuffer);ByteBuffer byteBuffer = ByteBuffer.allocate(8);for(long l = 0; l<100; l++){byteBuffer.putLong(0, l);producer.onData(byteBuffer);//Thread.sleep(1000);}disruptor.shutdown();//关闭 disruptor,方法会堵塞,直至所有的事件都得到处理;executor.shutdown();//关闭 disruptor 使用的线程池;如果需要的话,必须手动关闭, disruptor 在 shutdown 时不会自动关闭;        }
}

import java.nio.ByteBuffer;import com.lmax.disruptor.RingBuffer;
/*** 很明显的是:当用一个简单队列来发布事件的时候会牵涉更多的细节,这是因为事件对象还需要预先创建。* 发布事件最少需要两步:获取下一个事件槽并发布事件(发布事件的时候要使用try/finnally保证事件一定会被发布)。* 如果我们使用RingBuffer.next()获取一个事件槽,那么一定要发布对应的事件。* 如果不能发布事件,那么就会引起Disruptor状态的混乱。* 尤其是在多个事件生产者的情况下会导致事件消费者失速,从而不得不重启应用才能会恢复。* @since 2015年11月23日*/
public class LongEventProducer {private final RingBuffer<LongEvent> ringBuffer;public LongEventProducer(RingBuffer<LongEvent> ringBuffer){this.ringBuffer = ringBuffer;}/*** onData用来发布事件,每调用一次就发布一次事件* 它的参数会用过事件传递给消费者*/public void onData(ByteBuffer bb){//1.可以把ringBuffer看做一个事件队列,那么next就是得到下面一个事件槽long sequence = ringBuffer.next();try {//2.用上面的索引取出一个空的事件用于填充(获取该序号对应的事件对象)LongEvent event = ringBuffer.get(sequence);//3.获取要通过事件传递的业务数据event.setValue(bb.getLong(0));} finally {//4.发布事件//注意,最后的 ringBuffer.publish 方法必须包含在 finally 中以确保必须得到调用;如果某个请求的 sequence 未被提交,将会堵塞后续的发布操作或者其它的 producer。ringBuffer.publish(sequence);}}}

import java.nio.ByteBuffer;import com.lmax.disruptor.EventTranslatorOneArg;
import com.lmax.disruptor.RingBuffer;/*** Disruptor 3.0提供了lambda式的API。这样可以把一些复杂的操作放在Ring Buffer,* 所以在Disruptor3.0以后的版本最好使用Event Publisher或者Event Translator来发布事件* @since 2015年11月23日*/
public class LongEventProducerWithTranslator {//一个translator可以看做一个事件初始化器,publicEvent方法会调用它//填充Eventprivate static final EventTranslatorOneArg<LongEvent, ByteBuffer> TRANSLATOR = new EventTranslatorOneArg<LongEvent, ByteBuffer>() {@Overridepublic void translateTo(LongEvent event, long sequeue, ByteBuffer buffer) {event.setValue(buffer.getLong(0));}};private final RingBuffer<LongEvent> ringBuffer;public LongEventProducerWithTranslator(RingBuffer<LongEvent> ringBuffer) {this.ringBuffer = ringBuffer;}public void onData(ByteBuffer buffer){ringBuffer.publishEvent(TRANSLATOR, buffer);}}

Disruptor并发框架-1相关推荐

  1. Disruptor并发框架--学习笔记

    Disruptor并发框架简介 Martin Fowler在自己网站上写了一篇LMAX架构的文章,在文章中他介绍了LMAX是一种新型零售金融交易平台,它能够以很低的延迟产生大量交易.这个系统是建立在J ...

  2. Disruptor并发框架,核心组件RingBuffer

    1.1 Disruptor并发框架简介 Martin Fowler在自己网站上写了一篇LMAX架构的文章,在文章中他介绍了LMAX是一种新型零售金融交易平台,它能够以很低的延迟产生大量交易.这个系统是 ...

  3. Disruptor并发框架-2

    import java.util.concurrent.atomic.AtomicInteger;public class Trade { private String id;//ID private ...

  4. 并发框架Disruptor(核心概念 入门 高性能原理-伪共享 CAS 环形数据 生产和消费模式 高级使用 )

    并发框架Disruptor 并发框架Disruptor Disruptor概述 背景 什么是Disruptor 为什么使用Disruptor Disruptor 的核心概念 Ring Buffer S ...

  5. java 无锁框架_高性能无锁并发框架 Disruptor,太强了!

    Java技术栈 www.javastack.cn 关注优质文章 Disruptor是一个开源框架,研发的初衷是为了解决高并发下队列锁的问题,最早由LMAX提出并使用,能够在无锁的情况下实现队列的并发操 ...

  6. Java 并发框架全览,这个牛逼!

    来自:唐尤华 https://dzone.com/articles/a-birds-eye-view-on-java-concurrency-frameworks-1 1. 为什么要写这篇文章 几年前 ...

  7. 来,带你鸟瞰 Java 中的并发框架!

    来自 ImportNew,作者:唐尤华 https://dzone.com/articles/a-birds-eye-view-on-java-concurrency-frameworks-1 1. ...

  8. 互联网java常用框架_来,带你鸟瞰 Java 中4款常用的并发框架!

    1. 为什么要写这篇文章 几年前 NoSQL 开始流行的时候,像其他团队一样,我们的团队也热衷于令人兴奋的新东西,并且计划替换一个应用程序的数据库. 但是,当深入实现细节时,我们想起了一位智者曾经说过 ...

  9. java 并发框架源码_Java并发编程高阶技术-高性能并发框架源码解析与实战

    Java并发编程高阶技术-高性能并发框架源码解析与实战 1 _0 Z' @+ l: s3 f6 r% t|____资料3 Z9 P- I2 x8 T6 ^ |____coding-275-master ...

最新文章

  1. python之请求报文对比(假定最多二维字典)
  2. php 向二维数组中追加元素
  3. 关于迪杰斯特拉算法(最短路)的PHP实现
  4. coding ssh_exchange_identification: Connection closed by remote host
  5. c和java内存泄漏区别_内存溢出和内存泄漏的区别(转)
  6. ZooKeeper -- API文档
  7. Redis深入浅出----演讲
  8. layui 行变灰_layui table设置某一行的字体颜色方法
  9. 直播电商要处理好五个关系
  10. 20210422-微信刷脸支付获取调用凭证authinfo的时候,提示 rawdata无效
  11. 实时数仓-数据采集层_1
  12. 网络空间安全现状与国家战略
  13. iphone11屏比例_iphone11pro屏幕尺寸比例
  14. Vue中部署百度富文本编辑器UEditor及其自带的后端,并加入秀米插件
  15. 当C++遇上AUTOSAR编码规范,你的安全我来护航
  16. Go Hijack黑科技
  17. latex特殊字体咋打?+下标打在左边
  18. 安装windows时install.wim文件过大的解决方案
  19. Python带我飞:50个有趣而又鲜为人知的Python特性
  20. python壁纸高清图片_详解Python静态网页爬取获取高清壁纸

热门文章

  1. td 属性 noWrap 防止折行、撑开(及其它文字换行问题)
  2. jQuery.tmpl.js
  3. 回归分析---线性回归原理和Python实现
  4. 前端调试、兼容、适配指南与工具分享
  5. 菜鸟教程终极篇之Microsoft Windows Pre-installation Environment (Windows PE) 2.0
  6. Amdahl’s law (阿姆达尔定律)的演化和思考
  7. java springboot+maven发送邮件
  8. Oracle官方并发教程之中断
  9. [改善Java代码]构造函数尽量简化
  10. 测试ODBC与OLE