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 开发的一个无锁高性能的线程间消息传递的框架.目前 ...
随机推荐
- actionView
类似于actionBar也是在导航栏里用但是他使用的是menu菜单设置菜单项的AsAction=“always|withText” 本例使用LoaderCallbacks<Cursor>接 ...
- mybatis结合redis实战二级缓存
之前的文章中我们意见分析了一级缓存.二级缓存的相关源码和基本原理,今天我们来分享下了mybatis二级缓存和redis的结合,当然mybatis二级缓存也可以和ehcache.memcache.OSC ...
- 【D3D】Direct3D中LPRECT(上左右底)和LPoint(x,y)之前转换
D3DSprite.cpp void CD3DSprite::DrawText(CD3DFont *pFont, char *szString, RECT &DesRect, D3DCOLOR ...
- 读书笔记---改善c#编程的157个建议
1.在拼接string时,如果牵涉到其他类型,先tostring一下会减少装箱操作:频繁操作字符串变量的话,使用stringbuilder效率较高. 2.tryParse相对于parse而言效率高,t ...
- This page contains the following error
解决办法:将header头注释掉 header("content-type:text/xml; charset=UTF-8");
- FEATURE_MCT_READERDIRECT问题
刚才查了一下,好像与一个叫CCID的驱动有关.你把FEATURE_MCT_READEDIRECT定义成0x08,再make一下试试.
- 2. Get the codes from GIT
Clone the code from git.
- UI设计:掌握这6点,轻松0到1
非科班出身能成为UI设计师吗? 答案是肯定的.世上无难事,只怕有心人.只要找对方法.坚持不懈,即便是零基础也能学好UI设计. 那么零基础学习UI设计,需要学习哪些知识?我们要从哪些地方学起?怎么系统学 ...
- wcf数据推送
http://www.cnblogs.com/artech/archive/2007/03/02/661969.html
- java--多线程编程简介
1.什么时候使用多线程编程 一个任务在正常情况下是按顺序执行的,但是如果当前任务里有多个相似进程块(例如for,while语句),我们就可以考虑把这些代码块抽出来并行运行,无需阻塞 2.实现多线程的几 ...