Disruptor是什么可以阅读《高性能线程间队列DISRUPTOR简介》一文,下面重点讲讲在实际应用中如何去使用Disruptor。

项目结构如下:

CreateReqEvent.java

package com.bijian.study;

import com.lmax.disruptor.EventFactory;

public class CreateReqEvent {

private String reqStr;

public String getReqStr() {

return reqStr;

}

public void setReqStr(String reqStr) {

this.reqStr = reqStr;

}

private static class Factory implements EventFactory {

@Override

public CreateReqEvent newInstance() {

return new CreateReqEvent();

}

}

public static final CreateReqEvent.Factory FACTORY = new CreateReqEvent.Factory();

}

CreateReqEventHandler.java

package com.bijian.study;

import java.lang.invoke.MethodHandles;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import com.lmax.disruptor.EventHandler;

public class CreateReqEventHandler implements EventHandler {

private static Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());

@Override

public void onEvent(CreateReqEvent event, long sequence, boolean endOfBatch) throws Exception {

log.info("on event:{}", event.getReqStr());

}

}

CreateReqEventTranslator.java

package com.bijian.study;

import com.lmax.disruptor.EventTranslator;

public class CreateReqEventTranslator implements EventTranslator {

private String reqString;

public String getReqString() {

return reqString;

}

public void setReqString(String reqString) {

this.reqString = reqString;

}

@Override

public void translateTo(CreateReqEvent event, long sequence) {

event.setReqStr(reqString);

}

}

ReqEventUtil.java

package com.bijian.study;

import java.lang.invoke.MethodHandles;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import com.lmax.disruptor.BlockingWaitStrategy;

import com.lmax.disruptor.EventHandler;

import com.lmax.disruptor.dsl.Disruptor;

import com.lmax.disruptor.dsl.ProducerType;

public class ReqEventUtil {

private static Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());

private static volatile Disruptor disruptor;

private static ExecutorService executor;

//启动处理线程

static {

int ringBufferSize = 256 * 256; // RingBuffer 大小=65536,必须是 2的 N次方;

executor = Executors.newFixedThreadPool(4*4);

disruptor = new Disruptor(CreateReqEvent.FACTORY, ringBufferSize, executor, ProducerType.MULTI,new BlockingWaitStrategy());

EventHandler eventHandler = new CreateReqEventHandler();

disruptor.handleEventsWith(eventHandler);

disruptor.start();

}

public static void push(String reqString){

try {

log.info("push create reqString event:{}", reqString);

CreateReqEventTranslator translator = new CreateReqEventTranslator();

translator.setReqString(reqString);

disruptor.publishEvent(translator);

}catch (Exception e){

log.error("push CreateOrderEvent error:",e);

}

}

/**

* 停止处理

*/

public static void shutdown(){

log.info("shutdown now...");

if(disruptor != null) {

disruptor.shutdown();

}

if(executor != null) {

executor.shutdown();

}

}

}

测试类Main.java

package com.bijian.test;

import java.lang.invoke.MethodHandles;

import java.util.Scanner;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import com.bijian.study.ReqEventUtil;

public class Main {

private static Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());

public static void main(String[] args) {

Scanner sc = new Scanner(System.in);

while(sc.hasNext()) {

String reqStr = sc.nextLine();

log.info("输入的信息:" + reqStr);

if(reqStr.equals("exit")) {

ReqEventUtil.shutdown();

break;

}else {

ReqEventUtil.push(reqStr);

}

}

}

}

运行结果:

test

2018-12-24 23:12:26.337 [main] INFO Main.main(Main.java:20)[][][] - 输入的信息:test

2018-12-24 23:12:26.370 [main] INFO ReqEventUtil.push(ReqEventUtil.java:35)[][][] - push create reqString event:test

2018-12-24 23:12:26.371 [pool-2-thread-1] INFO CreateReqEventHandler.onEvent(CreateReqEventHandler.java:16)[][][] - on event:test

abc

2018-12-24 23:12:28.323 [main] INFO Main.main(Main.java:20)[][][] - 输入的信息:abc

2018-12-24 23:12:28.323 [main] INFO ReqEventUtil.push(ReqEventUtil.java:35)[][][] - push create reqString event:abc

2018-12-24 23:12:28.324 [pool-2-thread-1] INFO CreateReqEventHandler.onEvent(CreateReqEventHandler.java:16)[][][] - on event:abc

xyz

2018-12-24 23:12:30.628 [main] INFO Main.main(Main.java:20)[][][] - 输入的信息:xyz

2018-12-24 23:12:30.628 [main] INFO ReqEventUtil.push(ReqEventUtil.java:35)[][][] - push create reqString event:xyz

2018-12-24 23:12:30.628 [pool-2-thread-1] INFO CreateReqEventHandler.onEvent(CreateReqEventHandler.java:16)[][][] - on event:xyz

exit

2018-12-24 23:12:34.032 [main] INFO Main.main(Main.java:20)[][][] - 输入的信息:exit

2018-12-24 23:12:34.033 [main] INFO ReqEventUtil.shutdown(ReqEventUtil.java:49)[][][] - shutdown now...

java disruptor 例子_Disruptor应用实例相关推荐

  1. java jna 例子_JNA入门实例

    JNI是Java调用原生函数的唯一机制,JNA就是建立在JNI之上,JNA简化了Java调用原生函数的过程.JNA提供了一个动态的C语言编写的转发器(实际上也是一个动态链接库,在Linux-i386中 ...

  2. java适配器模式例子_java适配器模式实例解析

    适配器模式作为一种结构型设计模式,在软件系统设计开发中使用到的频率非常之高,深受开发人员的青睐.本文会讲解适配器模式的知识要点,以及在实际项目中所使用的真实案例. 1.适配器模式概述: 适配器模式(A ...

  3. java 大学简明教程_Simply-Java 《JAVA大学简明教程:实例程序设计》例子及习题源代码 - 下载 - 搜珍网...

    JAVA大学简明教程:实例程序设计/附书源代码/Tutorial01/MovingShapes/BoundedShape.class JAVA大学简明教程:实例程序设计/附书源代码/Tutorial0 ...

  4. java boolean例子_Java Boolean类实例

    下面要为大家分享的就是一个Java Boolean类方面的实例,一起来看看具体的内容吧. 编写一个java程序,演示,怎样使用不同的构造方法创建Boolean对象,并且调用booleanValue() ...

  5. Java.io.File.getPath()方法实例

    转载自  Java.io.File.getPath()方法实例 java.io.File.getPath() 方法将抽象路径名到路径名字符串.为了分离名称的序列所产生的字符串使用默认名称分隔符. 声明 ...

  6. AJAX for Java简单表数据查询实例

    AJAX for Java简单表数据查询实例<?XML:NAMESPACE PREFIX = O /> AJAX WebShop 3对Java开发具有良好的支持,同时也提供了各种层次的后台 ...

  7. 用Java 开发 WebService Axis简单实例

    用 Java 开发 WebService Axis 简单实例 在开发之前, 先了解一下AXIS,axis目前出现的2版本以其灵活性,快速开发工具的集成高于xfire而使用者居其上.用Eclipse开发 ...

  8. java程序性能优化(实例)

    java程序性能优化(实例) 一.避免在循环条件中使用复杂表达式 在不做编译优化的情况下,在循环中,循环条件会被反复计算,如果不使用复杂表达式,而使循环条件值不变的话,程序将会运行的更快. 例子: i ...

  9. java多附件上传 实例demo

    java多附件上传 实例demo <%@ page language="java" import="java.util.*" pageEncoding=& ...

最新文章

  1. 《数学之美》第8章 简单之美--布尔代数和搜索引擎
  2. kwvcprojparser不是内部_在盗版window xp上安装的visual studio 2010学习版编译ace6.1时出现如下问题...
  3. 接口请求时params与data的区别
  4. Elasticsearch对外提供分词服务实践
  5. TypeScript reflect-metadata 结合方法装饰器实现的一个自定义语法检查的例子
  6. 牛!Python 全栈必备的 150 个实战案例,一次性获得!
  7. Flink java wordcount案例(批处理、流处理)
  8. welcome-file-list标签的控制作用以及在springmvc中此标签的的配置方式
  9. Oracle 相关知识点结构图
  10. AI 之 OpenCvSharp 安卓手机摄像头识别人脸
  11. cordova打包APP更改图标和APP名字
  12. php微信支付接口的流程图,php如何设计微信支付接口
  13. url 转码 java_URL 转码遇到的坑
  14. phalapi做登录检测_PhalApi:[1.22] 签名验证:自定义签名规则
  15. 服务器主板主要组成部分(个人笔记,请勿参考)
  16. vite如何兼容低版本浏览器
  17. 如何控制H5 video 只能后退(向后拖动)不能快进(向前拖动)
  18. miscellaneous_7
  19. css 设置字体渐变色
  20. arcgis for javascript API3.13 加载天地图卫星影像

热门文章

  1. PMP思维导图 | 风险管理(一)
  2. linux系统里常用的抓图工具,linux下很棒的抓图工具——scrot
  3. 20201213c亲密数
  4. 淘宝商品评价api接口,商品评价解析api接口,商品评价分析api接口,淘宝商品评价信息api接口,宝贝评价api接口,
  5. 如何解决css动画抖动的问题
  6. Charles网络抓包新手入门教程-(二)软件配置与环境安装(ios14-IOS系统安装配置)
  7. Lua 公历转农历算法(1921~2040)
  8. 硬核浪漫!全球独有主动闪烁的卫星,用摩斯电码在七夕天空搭起一座“鹊桥”...
  9. 毕业设计-----个人理财app的设计与实现效果展示
  10. 武汉大学计算机专业博士导师,武汉大学计算机学院博士生导师简介:袁志勇