java多线程入门(六)Disruptor使用

简介: java多线程入门(六)Disruptor使用

1.简单认识下Disruptor



  • Disruptor是一款高效的无锁内存队列。它使用无锁的方式实现了一个环形队列,非常适合生产者和消费者模式,比如事件和消息的发布。


2.demo



2.1首先要声明一个消息传递的类


public class MsgEvent{
 private String value;
}
复制代码


2.2声明一个生产者


-需要一个Disruptor


class MsgProducer {
  private Disruptor<MsgEvent> disruptor;
  public MsgProducer(Disruptor<MsgEvent> disruptor){
      this.disruptor = disruptor;
  }
  public void send(String data){
      //得到队列
      RingBuffer<MsgEvent> ringBuffer = this.disruptor.getRingBuffer();
      //ringBuffer是个队列,其next方法返回的是下最后一条记录之后的位置,这是个可用位置
      long next = ringBuffer.next();
      try{
          //取出事件位置是空事件
          MsgEvent event = ringBuffer.get(next);
          //空的事件位置设置值
          event.setValue(data);
      }finally {
        //发布
        ringBuffer.publish(next);
      }
  }
复制代码


2.3声明一个消费者


-消费者实现接口EventHandler,实现onEvent方法


//消费者 
 class MyConsumer implements EventHandler<MsgEvent>{
  private String name;
  @Override
  public void onEvent(MsgEvent msgEvent, long l, boolean b) throws Exception {
      System.out.println(this.name+" -> 接收到信息: "+msgEvent.getValue());
  }
}
复制代码


//消费者
class MyWorkHandelr implements WorkHandler<MsgEvent>{
   private String name;
    public MyWorkHandelr(String name){
        this.name = name;
    }
    @Override
    public void onEvent(MsgEvent msgEvent) throws Exception {
        System.out.println(this.name+" -> 接收到信息: "+msgEvent.getValue());
    }
}
复制代码


2.4 测试


public static void test(){
  // RingBuffer生产工厂,初始化RingBuffer的时候使用
      EventFactory<MsgEvent> factory = new EventFactory<MsgEvent>() {
          @Override
          public MsgEvent newInstance() {
              return new MsgEvent();
          }
      };
         Disruptor<MsgEvent> disruptor = new Disruptor<>(factory, 1024, Executors.defaultThreadFactory(), ProducerType.SINGLE, new BlockingWaitStrategy());
      //绑定配置关系
      disruptor.handleEventsWith(new MyConsumer("cm_1"), new MyConsumer("cm_2"), new MyConsumer("cm_3"));
      disruptor.start();
      // 定义要发送的数据
      MsgProducer msgProducer = new MsgProducer(disruptor);
      for(int i=0;i<10;i++) {
        msgProducer.send(""+i);
      }
      disruptor.shutdown();
  }
复制代码


  • BlockingWaitStrategy
  • 加锁;这是默认策略,这里用了锁和条件condition进行数据监控和线程的唤醒,这个策略最节省cpu但是高并发下性能最差
  • SleepingWaitStrategy
  • 自旋、yield、sleep;对延时要求不是特别高的场合,对生产者线程的影响最小,典型用于异步日志类似的场景。

-YieldingWaitStrategy

  • 自旋、yield、自旋;性能最好,适合用于低延迟的系统,在要求极高性能且之间处理线数小于 cpu 逻辑核心数的场景中,推荐使用。(无锁策略。主要是使用了 Thread.yield() 多线程交替执行)
  • BusySpinWaitStrategy
  • 自旋;通过不断重试,减少切换线程导致的系统调用,而降低延迟。推荐在线程绑定到固定的CPU的场景下使用
  • TimeoutBlockingWaitStrategy
  • 加锁,有超时限制; CPU资源紧缺,吞吐量和延迟并不重要的场景
  • PhasedBackoffWaitStrategy
  • 自旋、yield、自定义策略; CPU资源紧缺,吞吐量和延迟并不重要的场景


3.使用的场景



网络异常,图片无法展示
|


  • //c1,c2,c3单独消费
  • disruptor.handleEventsWith(new MyConsumer("cm_1"), new MyConsumer("cm_2"), new MyConsumer("cm_3"));


网络异常,图片无法展示
|


  • //c3依赖 c1和c2
  • disruptor.handleEventsWith(new MyConsumer("cm_1"), new MyConsumer("cm_2")).then(new MyConsumer("cm_3"));
  • //先c1再c2、c3
  • disruptor.handleEventsWith(new MyConsumer("cm_1")).then(new MyConsumer("cm_2"),new MyConsumer("cm_3"));


网络异常,图片无法展示
|


  • //共同消费c1,c2再c3
  • disruptor.handleEventsWithWorkerPool(new MyWorkHandelr("cm_1"), new MyWorkHandelr("cm_2")).thenHandleEventsWithWorkerPool(new MyWorkHandelr("cm_3"));
相关文章
|
12月前
|
存储 Oracle Java
java零基础学习者入门课程
本课程为Java零基础入门教程,涵盖环境搭建、变量、运算符、条件循环、数组及面向对象基础,每讲配示例代码与实践建议,助你循序渐进掌握核心知识,轻松迈入Java编程世界。
863 0
|
12月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
597 1
|
12月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
521 1
|
Java
java入门代码示例
本文介绍Java入门基础,包含Hello World、变量类型、条件判断、循环及方法定义等核心语法示例,帮助初学者快速掌握Java编程基本结构与逻辑。
818 0
|
数据采集 存储 弹性计算
高并发Java爬虫的瓶颈分析与动态线程优化方案
高并发Java爬虫的瓶颈分析与动态线程优化方案
|
Java API 数据库
2025 年最新 Java 实操学习路线,从入门到高级应用详细指南
2025年Java最新实操学习路线,涵盖从环境搭建到微服务、容器化部署的全流程实战内容,助你掌握Java 21核心特性、Spring Boot 3.2开发、云原生与微服务架构,提升企业级项目开发能力,适合从入门到高级应用的学习需求。
3121 0
Java 数据库 Spring
521 0
|
前端开发 Java 数据库连接
帮助新手快速上手的 JAVA 学习路线最详细版涵盖从入门到进阶的 JAVA 学习路线
本Java学习路线涵盖从基础语法、面向对象、异常处理到高级框架、微服务、JVM调优等内容,适合新手入门到进阶,助力掌握企业级开发技能,快速成为合格Java开发者。
1505 3
|
监控 Java API
2025 年全新出炉的 Java 学习路线:从入门起步到实操精通的详细指南
2025年Java学习路线与实操指南,涵盖Java 21核心特性、虚拟线程、Spring Boot 3、微服务、Spring Security、容器化部署等前沿技术,助你从入门到企业级开发进阶。
1679 0
|
算法 Java
Java多线程编程:实现线程间数据共享机制
以上就是Java中几种主要处理多线程序列化资源以及协调各自独立运行但需相互配合以完成任务threads 的技术手段与策略。正确应用上述技术将大大增强你程序稳定性与效率同时也降低bug出现率因此深刻理解每项技术背后理论至关重要.
696 16

热门文章

最新文章