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