Disruptor使用简介

disruptor是lmax公司开发的一款java高性能并发框架,其本质是一种类似队列的实现“生产者—消费者 ”模式的组件。

 下面是其示例代码:

public class DisruptorServer {
    private Disruptor disruptor = null;

    public static void main(String[] args) {
        DisruptorContext.start();
        System.out.println("Disruptor服务已启动...");
       
        for(long i=0; i<101; i++){
            DisruptorContext.publish(i);
        }
        DisruptorContext.stop();
        System.out.println("...Disruptor服务已停止");
    }
}

public class DisruptorContext {
    private static Disruptor<LongEvent> disruptor = null;
    private static ExecutorService executor = null;
    
    public static void start(){
        if(null==disruptor){
        EventFactory<LongEvent> eventFactory = new LongEventFactory();
        executor = Executors.newSingleThreadExecutor();
        WaitStrategy waitStrategy = new BlockingWaitStrategy();
        int ringBufferSize = 1024*1024;
        disruptor = new Disruptor<LongEvent>(eventFactory, 
                                             ringBufferSize, 
                                             executor, 
                                             ProducerType.SINGLE, 
                                             waitStrategy);
        EventHandler<LongEvent> eventHandler = new LongEventHandler();
        disruptor.handleEventsWith(eventHandler);
        disruptor.start();
        }
    }
    
    public static void stop(){
        disruptor.shutdown();
        executor.shutdown();
    }
    
    public static void publish(long eventData){
        RingBuffer<LongEvent> ringBuffer = disruptor.getRingBuffer();
        long sequence = ringBuffer.next();
        try{
        LongEvent event = ringBuffer.get(sequence);
        event.set(eventData);
        }finally{
            ringBuffer.publish(sequence);
        }
    }
}

public class LongEvent {
    private long value;

    public void set(long value) {
        this.value = value;
    }
    
    public long get(){
        return this.value;
    }
}

public class LongEventFactory implements EventFactory<LongEvent> {

    @Override
    public LongEvent newInstance() {
        return new LongEvent();
    }

}

public class LongEventHandler implements EventHandler<LongEvent>{

    @Override
    public void onEvent(LongEvent event, long sequence, boolean endOfBatch) throws Exception {
        System.out.println("Disruptor消费者输出Event :" + event.get());
    }

}

从构造函数来看一下disruptor的几个组成部分:

Disruptor<LongEvent> disruptor = new Disruptor<LongEvent>(eventFactory, ringBufferSize, executor, ProducerType.SINGLE, waitStrategy);

Event 需要进入disruptor交换的对象都需要封装成event,本例中封装的是一个long

EventFactory   工厂,决定以何种方式创建event。  
  *   工厂模式:我不知道你需要的是什么样的对象,索性把你的构造方法(工厂)传过来吧。

EventHandler  事件处理的具体实现,也即producer——consumer中的consumer的具体实现
  *   本例中仅仅对event中的long进行输出

ringBuffer  存放event的地方, 生产者和消费者之间的缓冲,相当于一个无锁的环形队列

executor    jdk5 java.concurrent.*包里的线程池 ,用来执行消费者线程

ProducerType.SINGLE  说明这个disruptor是单生产者模式的(disruptor也支持多生产者模式)

waitStrategy   消费者的等待策略, 有blocking、sleeping、yielding三种

关于多个消费者

ExecutorService executor executor = Executors.newCachedThreadPool(); WaitStrategy yieldStrategy = new YieldingWaitStrategy(); Disruptor<LongEvent> disruptor = new Disruptor<LongEvent>(eventFactory,                                              ringBufferSize,                                              executor,                                              ProducerType.SINGLE,                                              yieldStrategy);                                              如上这种情况下,在EventHandler中让每个event处理sleep 1秒,设置2个EventHandler(2个消费者),最后执行disruptor 向其publish 100个event,最后执行了大约100秒。

可见,消费者与消费者之间是并行处理的,但单个消费者内部的100个事件来说是以同步方式处理的。

原文地址:https://www.cnblogs.com/lyhero11/p/5124844.html