package com.example.demo.util;
import com.lmax.disruptor.*;
import com.lmax.disruptor.dsl.Disruptor;
import com.lmax.disruptor.dsl.ProducerType;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* 高性能事件通知框架(比blockQue效率更高)
*/
public class DisruptorUtil {
static EventFactory<EventData> EventDataEventFactory=new EventFactory<EventData>() {
@Override
public EventData newInstance() {
return new EventData();
}
};
public static void main(String[] args) throws InterruptedException {
CountDownLatch countDownLatch=new CountDownLatch(1);
Disruptor<EventData> disruptor=
new Disruptor<EventData>(EventDataEventFactory,2<<10,
Executors.defaultThreadFactory(),
ProducerType.SINGLE, new YieldingWaitStrategy());
/* disruptor.handleEventsWith(new EventHandler<EventData>() {
@Override
public void onEvent(EventData o, long sequence, boolean endOfBatch) throws Exception {
System.out.println(o);
countDownLatch.countDown();
}
});*/
disruptor.handleEventsWithWorkerPool(eventData -> {
//从池中消费一个数据,异步消费(消费者)
System.out.println(eventData.getData());
countDownLatch.countDown();
});
disruptor.start();
//拿出一个池中的RingBuffer
RingBuffer<EventData> ringBuffer = disruptor.getRingBuffer();
//取出下一个数据的位置
long next = ringBuffer.next();
//取出挡墙数据
EventData o = ringBuffer.get(next);
//为数据设置值
o.setData("1");
//发布这个数据,发布(生产者)
ringBuffer.publish(next);
countDownLatch.await();
disruptor.shutdown();
}
static class EventData{
Object data;
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
}
}
10-19