实现EventFactory,在newInstance方法中返回,ringBuffer缓冲区中的对象实例;代码如下:

public class DTaskFactory implements EventFactory<DTask> {
@Override
public DTask newInstance() {//disruptor使用环形缓冲区,这是环形缓冲区所承载的对象
return new DTask();
}
}

生产消费的对象类型:

public class DTask {
public String getName1() {
return name1;
} public void setName1(String name1) {
this.name1 = name1;
} public String getName2() {
return name2;
} public void setName2(String name2) {
this.name2 = name2;
} public String getName3() {
return name3;
} public void setName3(String name3) {
this.name3 = name3;
} String name1;
String name2;
String name3; }

disruptor的消费处理事件onEvent为消费调用的方法(下面的代码中包含并行和串行执行的消费事件):

public class DTaskHandle implements EventHandler<DTask> {
@Override
public void onEvent(DTask dTask, long l, boolean b) throws Exception {
System.out.println("开始最后消费");
System.out.println(dTask.getName1()); System.out.println(dTask.getName2());
System.out.println(dTask.getName3());
System.out.println("结束最后消费");
}
} public class DTaskHandle1 implements EventHandler<DTask> {
@Override
public void onEvent(DTask dTask, long l, boolean b) throws Exception {
System.out.println("-----DTaskHandle1-----");
dTask.setName1("name1");
}
} public class DTaskHandle2 implements EventHandler<DTask> {
@Override
public void onEvent(DTask dTask, long l, boolean b) throws Exception {
System.out.println("-----DTaskHandle2-----");
dTask.setName2("name2");
}
} public class DTaskHandle3 implements EventHandler<DTask> {
@Override
public void onEvent(DTask dTask, long l, boolean b) throws Exception {
System.out.println("-----DTaskHandle3-----");
dTask.setName3("name3");
}
}

测试执行类:

public class DisruptorTest {

    public void exec() throws Exception {
ExecutorService executor = Executors.newCachedThreadPool();
Disruptor<DTask> disruptor = new Disruptor(new DTaskFactory(),
1024 * 1024,
executor,
ProducerType.SINGLE, new BusySpinWaitStrategy()); DTaskHandle dTaskHandle = new DTaskHandle();
DTaskHandle1 dTaskHandle1 = new DTaskHandle1();
DTaskHandle2 dTaskHandle2 = new DTaskHandle2();
DTaskHandle3 dTaskHandle3 = new DTaskHandle3();
disruptor.handleEventsWith(dTaskHandle1, dTaskHandle2, dTaskHandle3);//消费生产出的对象,并行执行 disruptor.after(dTaskHandle1, dTaskHandle2, dTaskHandle3).handleEventsWith(dTaskHandle);//并行执行1 2 3后,串行执行dTaskHandle // disruptor. disruptor.start();
CountDownLatch latch = new CountDownLatch(1);
//生产者准备
executor.submit(new TradePublisher(latch, disruptor)); latch.await();//等待生产者完事. disruptor.shutdown();
executor.shutdown();
} }

disruptor的并行用法的更多相关文章

  1. 并发框架Disruptor浅析

    1.引言 Disruptor是一个开源的Java框架,它被设计用于在生产者—消费者(producer-consumer problem,简称PCP)问题上获得尽量高的吞吐量(TPS)和尽量低的延迟.D ...

  2. Disruptor Ringbuffer

    系列译文: http://ifeve.com/disruptor/ 当有多个消费者时,(按Disruptor的设计)每个消费者各自控制自己的指针,依次读取每个Slot(也就是每个消费者都会读取到所有的 ...

  3. Disruptor 详解 一

    这篇博客将主要通过几个示例,简单讲述 Disruptor 的使用方法: 一.disruptor 简介 Disruptor 是英国外汇交易公司 LMAX 开发的一个无锁高性能的线程间消息传递的框架.目前 ...

  4. Oracle Hints详解

    在向大家详细介绍Oracle Hints之前,首先让大家了解下Oracle Hints是什么,然后全面介绍Oracle Hints,希望对大家有用.基于代价的优化器是很聪明的,在绝大多数情况下它会选择 ...

  5. Linux小工具的应用,grep,sort,wc,cut

    小工具的使用: 1.管道(|):连接多个命令的工具,进程之间通讯的一种方式 用法:命令1 | 命令2 | 命令3....2.grep工具:行过滤,打印出的结果一行一行的 用法:grep options ...

  6. C# IEnumerable,Lambda表达式和 Parallel并行编程的用法

    以前一直主要做C++和C方面的项目,对C#不太了解熟悉,但听说不难,也就一直没有在意学习C#方面的知识.今天有个C#项目,需要做些应用的扩展,同时修改一些bug.但看了C#代码,顿时觉得有些不适应了. ...

  7. C#并行库(TaskParallelLibrary)用法小结

    今天有空,总结一下.NET 4.5并行库(TaskParallelLibrary)用法. 也许C和C++的程序员刚刚开始写C#还习惯于new Thread来新建一个线程,但新建线程需要内存和CPU上下 ...

  8. 多线程爬坑之路--并发,并行,synchonrized同步的用法

    一.多线程的并发与并行: 并发:多个线程同时都处在运行中的状态.线程之间相互干扰,存在竞争,(CPU,缓冲区),每个线程轮流使用CPU,当一个线程占有CPU时,其他线程处于挂起状态,各线程断续推进. ...

  9. [Java多线程]-并发,并行,synchonrized同步的用法

    一.多线程的并发与并行: 并发:多个线程同时都处在运行中的状态.线程之间相互干扰,存在竞争,(CPU,缓冲区),每个线程轮流使用CPU,当一个线程占有CPU时,其他线程处于挂起状态,各线程断续推进. ...

随机推荐

  1. 解决:github上传时出现error: src refspec master does not match any

    原因分析 引起该错误的原因是,目录中没有文件,空目录是不能提交上去的 解决方法 touch README git add README git commit -m 'first commit' git ...

  2. linux下yum安装最新稳定版nginx

    ## 摘抄nginx官网文档 URL:http://nginx.org/en/linux_packages.html#stable To set up the yum repository for R ...

  3. Springboot学习笔记(二)-定时任务

    springboot中要使用定时任务需要在配置类或启动类上标注注解@EnableScheduling,并在定时执行的无参方法上标注注解@Scheduled,程序启动后会根据@Scheduled所提供的 ...

  4. README.md文件编辑

    111 蜗牛图片管理系统 =============== ## 安装环境 >+ thinkphp版本: >+ php版本:.0以上 >+ 需要安装在服务器环境,免费使用 ### 特点 ...

  5. ABBYY FineReader Pro for Mac有哪些特性(下)

    使用ABBYY FineReader Pro for Mac轻松转换纸质文档.PDF文件和数字文本照片为可编辑和可搜索的文件,再也不需要手动重新输入或格式化了,相反,可以编辑.搜索.共享.归档和复制文 ...

  6. [Laravel] 10 - WEB API : wrapper

    前言 一.常用的解决方案 React 前端 + PHP (Laravel) 后端 Such as "some exposure to WEB API’s and/or RESTful“. 使 ...

  7. SyntheticEvent

    在react 的事件中使用SyntheticEvent 就会出现下面的报错 <input onChange={async e => { await foo() ... }} /> 那 ...

  8. docker 怎么下载指定版本的镜像文件

    在使用Docker时我想pull远端仓库的CentOS 6的镜像,但是我直接搜索下载下来的是最新的版本.那我有没有什么办法直接下载Centos6呢? 方法: 直接上 hub.docker.com 查 ...

  9. day_6.10py面试题:访问百度的过程

    DNS : 解析域名 DHCP:一种协议,自动分配ip 发现局域网中没有ip的电脑分配ip 面试题: 访问百度的整个过程 打开浏览器,访问百度的过程: 1.我的电脑确定有无网关,arp得到默认网管ma ...

  10. perl 读取一个文件 替换文件的关键词 把数据替换到新的文件

    replace # replace #!/usr/bin/perl my @data = (); my ($fname ,$rp, $nfname)= @ARGV; my ($o, $n) = spl ...