Disruptor框架简介:

并发框架,基于事件驱动,使用观察者模式

底层采用环形数组,取模算法

简单使用:

/**
* 声明一个Event:表示生产者和消费者之间传递的数据类型
*/
public class LongEvent { private Long value; public Long getValue() {
return value;
} public void setValue(Long value) {
this.value = value;
} }

工厂:

/**
* 实例化
*/
public class LongEventFactory implements EventFactory<LongEvent> { public LongEvent newInstance() {
return new LongEvent();
} }

消费者:

/**
* 消费者
*/
public class LongEventHandler implements EventHandler<LongEvent> { public void onEvent(LongEvent event, long sequence, boolean endOfBatch) throws Exception {
System.out.println("消费者获取数据:"+event.getValue());
} }

生产者:

/**
* 生产者
*/
public class LongEventProducer { private RingBuffer<LongEvent> ringBuffer; public LongEventProducer(RingBuffer<LongEvent> ringBuffer) {
this.ringBuffer = ringBuffer;
} public void onData(ByteBuffer byteBuffer) {
//获取事件队列的下标位置
long sequence = ringBuffer.next();
try {
//取出空队列
LongEvent longEvent = ringBuffer.get(sequence);
//给空队列赋值
longEvent.setValue(byteBuffer.getLong(0));
} catch (Exception e) {
e.printStackTrace();
} finally {
System.out.println("生产者发送数据");
//发送数据
ringBuffer.publish(sequence);
}
} }

启动:

public class Main {

    public static void main(String[] args) {
//创建可缓存线程池
ExecutorService executor = Executors.newCachedThreadPool();
//创建工厂
EventFactory<LongEvent> factory = new LongEventFactory();
//创建RingBuffer(必须为2的N次方)
int ringBuffer = 1024 * 1024;
//创建Disruptor
Disruptor<LongEvent> disruptor = new Disruptor<LongEvent>(
factory,
ringBuffer,
executor,
ProducerType.MULTI,
new YieldingWaitStrategy()
);
//注册消费者(如果注册多个消费者默认是重复消费)
disruptor.handleEventsWith(new LongEventHandler());
//启动
disruptor.start();
//创建RingBuffer容器
RingBuffer<LongEvent> buffer = disruptor.getRingBuffer();
//创建生产者
LongEventProducer longEventProducer = new LongEventProducer(buffer);
//定义大小为8的缓冲区
ByteBuffer byteBuffer = ByteBuffer.allocate(8);
for (int i = 0; i < 100; i++) {
byteBuffer.putLong(0, i);
longEventProducer.onData(byteBuffer);
}
executor.shutdown();
disruptor.shutdown();
} }

打印如下:

....................
消费者获取数据:39
生产者发送数据
消费者获取数据:40
生产者发送数据
消费者获取数据:41
生产者发送数据
消费者获取数据:42
....................

Java深入学习(6):Disruptor的更多相关文章

  1. Java的学习之路

    记事本 EditPlus eclipse Java的学习软件,已经系统性学习Java有一段时间了,接下来我想讲一下我在Java学习用到的软件. 1.第一个软件:记事本 记事本是Java学习中最基础的编 ...

  2. Java多线程学习笔记

    进程:正在执行中的程序,其实是应用程序在内存中运行的那片空间.(只负责空间分配) 线程:进程中的一个执行单元,负责进程汇总的程序的运行,一个进程当中至少要有一个线程. 多线程:一个进程中时可以有多个线 ...

  3. Java Web 学习路线

    实际上,如果时间安排合理的话,大概需要六个月左右,有些基础好,自学能力强的朋友,甚至在四个月左右就开始找工作了.大三的时候,我萌生了放弃本专业的念头,断断续续学 Java Web 累计一年半左右,总算 ...

  4. Java基础学习-- 继承 的简单总结

    代码参考:Java基础学习小记--多态 为什么要引入继承? 还是做一个媒体库,里面可以放CD,可以放DVD.如果把CD和DVD做成两个没有联系的类的话,那么在管理这个媒体库的时候,要单独做一个添加CD ...

  5. 20145213《Java程序设计学习笔记》第六周学习总结

    20145213<Java程序设计学习笔记>第六周学习总结 说在前面的话 上篇博客中娄老师指出我因为数据结构基础薄弱,才导致对第九章内容浅尝遏止地认知.在这里我还要自我批评一下,其实我事后 ...

  6. [原创]java WEB学习笔记95:Hibernate 目录

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  7. Java多线程学习(转载)

    Java多线程学习(转载) 时间:2015-03-14 13:53:14      阅读:137413      评论:4      收藏:3      [点我收藏+] 转载 :http://blog ...

  8. java基础学习总结——java环境变量配置

    前言 学习java的第一步就要搭建java的学习环境,首先是要安装JDK,JDK安装好之后,还需要在电脑上配置"JAVA_HOME”."path”."classpath& ...

  9. Java Web学习系列——Maven Web项目中集成使用Spring、MyBatis实现对MySQL的数据访问

    本篇内容还是建立在上一篇Java Web学习系列——Maven Web项目中集成使用Spring基础之上,对之前的Maven Web项目进行升级改造,实现对MySQL的数据访问. 添加依赖Jar包 这 ...

  10. Java Web学习系列——Maven Web项目中集成使用Spring

    参考Java Web学习系列——创建基于Maven的Web项目一文,创建一个名为LockMIS的Maven Web项目. 添加依赖Jar包 推荐在http://mvnrepository.com/.h ...

随机推荐

  1. 关于System.FormatException异常

    什么是FormatException 参数格式无效或复合格式字符串不正确时引发的异常. 继承 Object Exception SystemException FormatException 详细说明 ...

  2. restQL 微服务查询语言

    restQL 是一个强大的微服务查询语言,类似sql,支持并行.链式.过滤.同时官方也提供了多种语言的实现 而且还有一个manger 与 graphql 以及Falcor的比较 以下是来自官方的比较说 ...

  3. ESA2GJK1DH1K升级篇: STM32远程乒乓升级,基于(WIFI模块AT指令TCP透传方式),定时访问升级

    前言 学习此代码所需: 实现功能概要 定时使用http访问云端的程序版本,如果版本不一致,然后通过http下载最新的升级文件,实现升级. 测试准备工作(默认访问我的服务器,改为自己的服务器,请看后面说 ...

  4. 专题-主存储器与Cache的地址映射方式

    2019/05/02 10:23 首先,我们注意到地址映射有三种:分别是直接地址映射.全相联映射.组相联映射. 首先我们搞清楚主存地址还有Cache地址的关系,还有组内地址的关系,常见我们的块内地址, ...

  5. centos7 安装 mysql5.7.25

    一.检查是否安装了mysql和mariadb,若已经安装就需要卸载. [root@localhost ~]# rpm -qa|grep mariadb // 查询出来已安装的mariadb [root ...

  6. sublime插件开发: 文件说明

    sublime插件开发 文件 .sublime-settings 设置文件 Main.sublime-menu 主菜单按钮配置文件 Side Bar.sublime-menu 侧边栏菜单文件列表,选中 ...

  7. Android的开机启动流程

    1.Android的开机启动流程 Android的层次框架图,如下所示: 图片清晰地展示了Android的五层架构,从上到下依次是:应用层.应用框架层.库层.运行时层以及Linux内核层.Androi ...

  8. Git flow 工作流与规范

    概述 简版图: PS. 可能用到的命令: 1.从指定 commit拉出新分支   git checkout commitId -b 本地新branchName git checkout 9fbc3d0 ...

  9. NPOI导出 The maximum column width for an individual cell is 255 characters

    增加如下代码 ) { arrColWidth[column.Ordinal] = ; } //设置列宽 sheet.SetColumnWidth(column.Ordinal, (arrColWidt ...

  10. 第四节:配置的读取、StartUp类、内置依赖注入和扩展改造

    一. 配置的读取 在Asp.Net Core中,有一个 appsettings.json 文件,用于存储相应的配置信息,读取的时,要通过构造函数注入:IConfiguration Configurat ...