Java深入学习(6):Disruptor
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的更多相关文章
- Java的学习之路
记事本 EditPlus eclipse Java的学习软件,已经系统性学习Java有一段时间了,接下来我想讲一下我在Java学习用到的软件. 1.第一个软件:记事本 记事本是Java学习中最基础的编 ...
- Java多线程学习笔记
进程:正在执行中的程序,其实是应用程序在内存中运行的那片空间.(只负责空间分配) 线程:进程中的一个执行单元,负责进程汇总的程序的运行,一个进程当中至少要有一个线程. 多线程:一个进程中时可以有多个线 ...
- Java Web 学习路线
实际上,如果时间安排合理的话,大概需要六个月左右,有些基础好,自学能力强的朋友,甚至在四个月左右就开始找工作了.大三的时候,我萌生了放弃本专业的念头,断断续续学 Java Web 累计一年半左右,总算 ...
- Java基础学习-- 继承 的简单总结
代码参考:Java基础学习小记--多态 为什么要引入继承? 还是做一个媒体库,里面可以放CD,可以放DVD.如果把CD和DVD做成两个没有联系的类的话,那么在管理这个媒体库的时候,要单独做一个添加CD ...
- 20145213《Java程序设计学习笔记》第六周学习总结
20145213<Java程序设计学习笔记>第六周学习总结 说在前面的话 上篇博客中娄老师指出我因为数据结构基础薄弱,才导致对第九章内容浅尝遏止地认知.在这里我还要自我批评一下,其实我事后 ...
- [原创]java WEB学习笔记95:Hibernate 目录
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- Java多线程学习(转载)
Java多线程学习(转载) 时间:2015-03-14 13:53:14 阅读:137413 评论:4 收藏:3 [点我收藏+] 转载 :http://blog ...
- java基础学习总结——java环境变量配置
前言 学习java的第一步就要搭建java的学习环境,首先是要安装JDK,JDK安装好之后,还需要在电脑上配置"JAVA_HOME”."path”."classpath& ...
- Java Web学习系列——Maven Web项目中集成使用Spring、MyBatis实现对MySQL的数据访问
本篇内容还是建立在上一篇Java Web学习系列——Maven Web项目中集成使用Spring基础之上,对之前的Maven Web项目进行升级改造,实现对MySQL的数据访问. 添加依赖Jar包 这 ...
- Java Web学习系列——Maven Web项目中集成使用Spring
参考Java Web学习系列——创建基于Maven的Web项目一文,创建一个名为LockMIS的Maven Web项目. 添加依赖Jar包 推荐在http://mvnrepository.com/.h ...
随机推荐
- Scikit-learn Preprocessing 预处理
本文主要是对照scikit-learn的preprocessing章节结合代码简单的回顾下预处理技术的几种方法,主要包括标准化.数据最大最小缩放处理.正则化.特征二值化和数据缺失值处理. 数学基础 均 ...
- Mac下Sublime Text常用插件
Mac下Sublime Text常用插件 SideBarEnhancements 右键菜单增强插件 BracketHighlighter 括号.引号.标签高亮插件 Pretty JSON JSON美化 ...
- Java 签名验签工具类
public class SignatureUtil { private static final String CHARSET = "UTF-8"; private static ...
- Qt应用程序主窗口之二:拖放操作与打印文档
一.拖放操作 对于一个实用的应用程序,不仅希望能从文件菜单中打开一个文件,更希望可以通过拖动直接将桌面上的文件拖入程序界面上来打开,就像可以将.pro文件拖入Creator中来打开整个项目一样.Qt中 ...
- python 散点图上给每个点打标签方便看到数据
import numpy as np import matplotlib.pyplot as plt x=[2.3,4.5,3,7,6.5,4,5.3] y=[5,4,7,5,5.3,5.5,6.2] ...
- Python 3.X 练习集100题 05
用 *号输出字母 C的图案 方法1: print(" ***** ") print(" ** * ") print(" ** ") prin ...
- Android启动脚本init.rc说明文档readme.txt翻译
Android Init Language--------------------- Android初始化语言--------------------- The Android Init Langua ...
- Git flow 工作流与规范
概述 简版图: PS. 可能用到的命令: 1.从指定 commit拉出新分支 git checkout commitId -b 本地新branchName git checkout 9fbc3d0 ...
- [转帖]IBM Q3财报:云营收达到50亿美元 上升11%
IBM Q3财报:云营收达到50亿美元 上升11% http://www.eetop.cn/cpu_soc/6946136.html 2019年Q3 IBM的营收 从千亿到 缩减到了 八百亿刀 卖掉了 ...
- Lua函数声明与调用
lua编程中,我们经常也会遇到函数的声明定义和调用. [1]lua中函数定义与调用的方法 lua有两种函数定义和调用的方法(本质都是用属性,方式不同而已): (1)点号形式 (2)冒号形式 两种方法的 ...