Disruptor使用简介
disruptor是lmax公司开发的一款java高性能并发框架,其本质是一种类似队列的实现“生产者—消费者 ”模式的组件。
下面是其示例代码:
public class DisruptorServer {
private Disruptor disruptor = null;
public static void main(String[] args) {
DisruptorContext.start();
System.out.println("Disruptor服务已启动...");
for(long i=0; i<101; i++){
DisruptorContext.publish(i);
}
DisruptorContext.stop();
System.out.println("...Disruptor服务已停止");
}
}
public class DisruptorContext {
private static Disruptor<LongEvent> disruptor = null;
private static ExecutorService executor = null;
public static void start(){
if(null==disruptor){
EventFactory<LongEvent> eventFactory = new LongEventFactory();
executor = Executors.newSingleThreadExecutor();
WaitStrategy waitStrategy = new BlockingWaitStrategy();
int ringBufferSize = 1024*1024;
disruptor = new Disruptor<LongEvent>(eventFactory,
ringBufferSize,
executor,
ProducerType.SINGLE,
waitStrategy);
EventHandler<LongEvent> eventHandler = new LongEventHandler();
disruptor.handleEventsWith(eventHandler);
disruptor.start();
}
}
public static void stop(){
disruptor.shutdown();
executor.shutdown();
}
public static void publish(long eventData){
RingBuffer<LongEvent> ringBuffer = disruptor.getRingBuffer();
long sequence = ringBuffer.next();
try{
LongEvent event = ringBuffer.get(sequence);
event.set(eventData);
}finally{
ringBuffer.publish(sequence);
}
}
}
public class LongEvent {
private long value;
public void set(long value) {
this.value = value;
}
public long get(){
return this.value;
}
}
public class LongEventFactory implements EventFactory<LongEvent> {
@Override
public LongEvent newInstance() {
return new LongEvent();
}
}
public class LongEventHandler implements EventHandler<LongEvent>{
@Override
public void onEvent(LongEvent event, long sequence, boolean endOfBatch) throws Exception {
System.out.println("Disruptor消费者输出Event :" + event.get());
}
}
从构造函数来看一下disruptor的几个组成部分:
Disruptor<LongEvent> disruptor = new Disruptor<LongEvent>(eventFactory, ringBufferSize, executor, ProducerType.SINGLE, waitStrategy);
Event 需要进入disruptor交换的对象都需要封装成event,本例中封装的是一个long
EventFactory 工厂,决定以何种方式创建event。
* 工厂模式:我不知道你需要的是什么样的对象,索性把你的构造方法(工厂)传过来吧。
EventHandler 事件处理的具体实现,也即producer——consumer中的consumer的具体实现
* 本例中仅仅对event中的long进行输出
ringBuffer 存放event的地方, 生产者和消费者之间的缓冲,相当于一个无锁的环形队列
executor jdk5 java.concurrent.*包里的线程池 ,用来执行消费者线程
ProducerType.SINGLE 说明这个disruptor是单生产者模式的(disruptor也支持多生产者模式)
waitStrategy 消费者的等待策略, 有blocking、sleeping、yielding三种
关于多个消费者
ExecutorService executor executor = Executors.newCachedThreadPool(); WaitStrategy yieldStrategy = new YieldingWaitStrategy(); Disruptor<LongEvent> disruptor = new Disruptor<LongEvent>(eventFactory, ringBufferSize, executor, ProducerType.SINGLE, yieldStrategy); 如上这种情况下,在EventHandler中让每个event处理sleep 1秒,设置2个EventHandler(2个消费者),最后执行disruptor 向其publish 100个event,最后执行了大约100秒。
可见,消费者与消费者之间是并行处理的,但单个消费者内部的100个事件来说是以同步方式处理的。
Disruptor使用简介的更多相关文章
- Disruptor 使用简介
[开发总结]Disruptor 使用简介 在极客时间看到王宝令老师关于 Disruptor 的一篇文章,觉得很有意思.看完之后又在网上找到一些其他关于Disruptor 的资料看了一下. 现在写篇文章 ...
- Java深入学习(6):Disruptor
Disruptor框架简介: 并发框架,基于事件驱动,使用观察者模式 底层采用环形数组,取模算法 简单使用: /** * 声明一个Event:表示生产者和消费者之间传递的数据类型 */ public ...
- Disruptor并发框架(一)简介&上手demo
框架简介 Martin Fowler在自己网站上写了一篇LMAX架构的文章,在文章中他介绍了LMAX是一种新型零售金融交易平台,它能够以很低的延迟产生大量交易.这个系统是建立在JVM平台上,其核心是一 ...
- Disruptor并发框架简介
Martin Fowler在自己网站上写一篇LMAX架构的文章,在文章中他介绍了LMAX是一种新型零售金额交易平台,它能够以很低的延迟产生大量交易.这个系统是建立在JVM平台上,其核心是一个业务逻辑处 ...
- disruptor 高并发编程 简介demo
原文地址:http://www.cnblogs.com/qiaoyihang/p/6479994.html disruptor适用于大规模低延迟的并发场景.可用于读写操作分离.数据缓存,速度匹配(因为 ...
- 从构建分布式秒杀系统聊聊Disruptor高性能队列
前言 秒杀架构持续优化中,基于自身认知不足之处在所难免,也请大家指正,共同进步.文章标题来自码友 简介 LMAX Disruptor是一个高性能的线程间消息库.它源于LMAX对并发性,性能和非阻塞算法 ...
- 无锁并发框架Disruptor学习入门
刚刚听说disruptor,大概理一下,只为方便自己理解,文末是一些自己认为比较好的博文,如果有需要的同学可以参考. 本文目标:快速了解Disruptor是什么,主要概念,怎么用 1.Disrupto ...
- 01-项目简介Springboot简介入门配置项目准备
总体课程主要分为4个阶段课程: ------------------------课程介绍------------------------ 01-项目简介Springboot简介入门配置项目准备02-M ...
- Disruptor 详解 一
这篇博客将主要通过几个示例,简单讲述 Disruptor 的使用方法: 一.disruptor 简介 Disruptor 是英国外汇交易公司 LMAX 开发的一个无锁高性能的线程间消息传递的框架.目前 ...
随机推荐
- iOS 开发 需要的版本管理工具,UI图,bug管理工具等
1.版本管理工具 或直接 终端敲命令SVN(smartSvn 或者cornerstone/终端) 或git (sourceTree/终端) 2. 原型管理工具 使用墨刀(https://modao ...
- 23-新建maven 项目
1. 新建:Maven Project; 2. 配置项 bulid path, 添加tomcat: 3. 新建一个sources文件夹: srt/test/resourses 4.配置她的默认输出路径 ...
- 7-掉馅饼(数组dp)
/* 免费馅饼 时间限制:1000 ms | 内存限制:65535 KB ...
- PAT 1047 编程团体赛(代码)
1047 编程团体赛(20)(20 分) 编程团体赛的规则为:每个参赛队由若干队员组成:所有队员独立比赛:参赛队的成绩为所有队员的成绩和:成绩最高的队获胜. 现给定所有队员的比赛成绩,请你编写程序找出 ...
- 全基因组测序 从头测序(de novo sequencing) 重测序(re-sequencing)
全基因组测序 全基因组测序分为从头测序(de novo sequencing)和重测序(re-sequencing). 从头测序(de novo)不需要任何参考基因组信息即可对某个物种的基因组进行测序 ...
- PhpStorm 注册相关
网址 http://idea.lanyus.com/ 最新(2017年9月)PhpStorm 2017.3 .WebStorm 2017.2.5.PyCharm 2016.3激活方式 打开网址 ht ...
- 将C语言宏定义数值转换成字符串!
将C语言宏定义转换成字符串! 摘自:https://blog.csdn.net/happen23/article/details/50602667 2016年01月28日 19:15:47 六个九十度 ...
- 【Web】网站主如何更改网页标签的图标(favicon.ico)
修改web项目的favicon图标,方式有两种:全局方式和局部方式 全局方式: 进入服务器\webapps\ROOT,然后用自己的favicon.ico替换服务器自带的favicon.ico图片 局部 ...
- Python 析构方法__del__
class Car: def __init__(self): print('---ok---') def __del__(self): print('----deconstrcut-------') ...
- Event事件冒泡和事件捕获
<!doctype html> <html lang="en"> <head> <meta charset="gb2312&qu ...