disruptor案列

来源:互联网 发布:淘宝关小黑屋 编辑:程序博客网 时间:2024/06/05 10:07
<dependency>    <groupId>com.lmax</groupId>    <artifactId>disruptor</artifactId>    <version>3.3.6</version></dependency>

类1:封装数据对象

public class Data {    private int num;    public int getNum() {        return num;    }    public void setNum(int num) {        this.num = num;    }}

类2:消费者

import com.lmax.disruptor.WorkHandler;public class Customer implements WorkHandler<Data>{    public void onEvent(Data event) throws Exception {        System.out.println(Thread.currentThread().getName()+"|"+event.getNum());    }}

类3:消费者工厂(用来初始化环形结构中的对象)

import com.lmax.disruptor.EventFactory;public class DataFactory implements EventFactory<Data>{    public Data newInstance() {        return new Data();    }}

类4:生产者

import com.lmax.disruptor.RingBuffer;public class Producer {    private RingBuffer<Data> ringBuffer;    public Producer(RingBuffer<Data> ringBuffer) {        this.ringBuffer = ringBuffer;    }    public void push(int num){        long seq = ringBuffer.next();        try {            Data data = ringBuffer.get(seq);            data.setNum(num);        } finally {            ringBuffer.publish(seq);        }    }}

类5:main

import java.util.concurrent.Executors;import com.lmax.disruptor.RingBuffer;import com.lmax.disruptor.dsl.Disruptor;public class Test {    @SuppressWarnings("unchecked")    public static void main(String[] args) {        Disruptor<Data> disruptor = new Disruptor<Data>(new DataFactory(), 1024, Executors.defaultThreadFactory());        disruptor.handleEventsWithWorkerPool(new Customer(),new Customer());        disruptor.start();        RingBuffer<Data> ringBuffer = disruptor.getRingBuffer();        Producer producer = new Producer(ringBuffer);        for (int i = 0; i < 100; i++) {            producer.push(i);        }        disruptor.shutdown();    }}