disruptor笔记3-多生产者和多消费者操作

本文介绍了Disruptor在实现多生产者和多消费者模式时如何避免内存溢出和宕机风险。通过使用线程池管理消费者线程,即使消费者数量较多,也能保证系统的稳定运行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

disruptor 多生产者和多消费者

单个消费者消费时,有几个消费者就需要启动几个线程,如果消费者过多,会使服务器存在党内存溢出甚至宕机的危险。

但是多消费者模式,并不会存在这样的危险,多消费者使用的是线程池管理消费者线程。

  • 测试类

    package com.tkn.disruptor.heigh.multi;
    
    import com.lmax.disruptor.*;
    import com.lmax.disruptor.dsl.ProducerType;
    
    import java.util.UUID;
    import java.util.concurrent.CountDownLatch;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    
    /**
     *  多生产者和多消费者
     */
    public class Main {
         
         
    
        public static void main(String[] args) throws InterruptedException {
         
         
            //1 创建RingBuffer
            RingBuffer<Order> ringBuffer = RingBuffer.create(ProducerType.MULTI, new EventFactory<Order>() {
         
         
    
                @Override
                public Order newInstance() {
         
         
                    return new Order();
                }
            }, 1024 * 1024, new YieldingWaitStrategy());
    
            //2 通过ringBuffer 创建一个屏障
            SequenceBarrier barrier = ringBuffer.newBarrier();
    
            //3 创建多个消费者数组:
            Consumer[] consumers=  new Consumer[10];
            for (int i = 0; i < consumers.length; i++) {
         
         
                consumers[i]=new Consumer("C"+i);
            }
            //4 构建多消费者工作池
            WorkerPool<Order> workerPool=new WorkerPool<>(ringBuffer,
                    barrier,
                    new EventExceptionHandle(),
                    consumers);
            //5 设置多个消费者的sequence序号 用于单独统计消费进度, 并且设置到ringbuffer中
            ringBuffer.addGatingSequences(workerPool.getWorkerSequences());
    
            //6 启动workerPool
            ExecutorService pool = Executors.newFixedThreadPool(5);
            workerPool.start
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值