disruptor学习
来源:互联网 发布:matlab创建三维数组 编辑:程序博客网 时间:2024/05/17 08:20
数据基类
public class Data { private String id; private String name; private String age; public Data() { } public Data(String id, String name, String age) { super(); this.id = id; this.name = name; this.age = age; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAge() { return age; } public void setAge(String age) { this.age = age; }}
ringBuffer环
public class DataRingBuffer { private static RingBuffer<Data> ringbuffer; private static EventFactory<Data> factory = new EventFactory<Data>() { @Override public Data newInstance() { return new Data(); } }; private DataRingBuffer() { //ringbuffer = RingBuffer.create(ProducerType.MULTI, factory, 4 * 1024, new SleepingWaitStrategy()); //create(ProducerType producerType, //生产者类型:单个SingleProducerSequencer 多个MultiProducerSequencer // EventFactory<E> factory, // int bufferSize, // WaitStrategy waitStrategy) } public static RingBuffer<Data> getRingBuffer() { if (ringbuffer == null) { synchronized (DataRingBuffer.class) { if (ringbuffer == null) { ringbuffer = RingBuffer.create(ProducerType.MULTI, factory, 4 * 1024, new SleepingWaitStrategy()); } } } return ringbuffer; } /** * 往环里增加数据 * @param commondRole */ public void publish(Data t) { long next = -1; try { next = ringBuffer.next(); Data data = ringBuffer.get(next); data.setAge(t.getAge()); data.setId(t.getId()); data.setName(t.getName()); ringBuffer.publish(next); } catch (Throwable e) { // } finally { if (next != -1) { ringBuffer.publish(next); } } }}
处理数据类1
public class DataHandle implements EventHandler<Data>{ @Override public void onEvent(Data event, long sequence, boolean endOfBatch) throws Exception { System.out.println("数据处理:"+event.getId()+"=="+event.getName()+"=="+event.getAge()); System.out.println(Thread.currentThread().getName()); }}
处理数据类2
public class DataHandle2 implements EventHandler<Data>{ @Override public void onEvent(Data event, long sequence, boolean endOfBatch) throws Exception { System.out.println("DataHandle2数据处理:"+event.getId()+"新的处理"+"=="+event.getName()+"=="+event.getAge()); }}
测试处理数据:
public static void test1() { //数据类,维护一个Ringbuffer,并有返回Ringbuffer实例对象的方法 //DataRingBuffer dataRing=new DataRingBuffer(); //获取一个Ringbuffer实例 //RingBuffer<Data> ringBuffer =dataRing.getRingBuffer(); RingBuffer<Data> ringBuffer=DataRingBuffer.getRingBuffer(); //消费者与RingBuffer之间的桥梁 SequenceBarrier newBarrier=ringBuffer.newBarrier(); //数据处理 自定义处理逻辑 EventHandler<Data> handle=new DataHandle(); //final DataProvider<T> dataProvider,RingBuffer实现了接口(EventSequencer) //final SequenceBarrier sequenceBarrier, //事件处理器 //final EventHandler<? super T> eventHandler) BatchEventProcessor<Data> processor= new BatchEventProcessor<Data>(ringBuffer, newBarrier, handle); //添加特定的顺序控制 安全并自动添加到序列清单 ringBuffer.addGatingSequences(processor.getSequence()); //创建线程池 ExecutorService管理线程,并提供停止方法 ExecutorService threadPool=Executors.newCachedThreadPool(); //提交任务 实现runable接口 threadPool.submit(processor); for(int i=0;i<100;i++){ //申请空间存放数据 long sequence=ringBuffer.next(); Data data=ringBuffer.get(sequence); data.setId("0"+i); data.setAge("222"); data.setName("333"); ringBuffer.publish(sequence); } // threadPool.shutdown();//停止线程 }
测试前后处理数据:
public static void test2() { Executor executor=Executors.newCachedThreadPool(); Disruptor<Data> disruptor = new Disruptor<Data>(new EventFactory<Data>() { @Override public Data newInstance() { return new Data(); } },4*1024,executor, ProducerType.SINGLE,new BlockingWaitStrategy()); EventHandler<Data> handle1=new DataHandle(); EventHandler<Data> handle2=new DataHandle2(); //处理器1处理完,扔给处理器2处理(1)// SequenceBarrier sequenceBarrier=disruptor.handleEventsWith(handle1).asSequenceBarrier();// BatchEventProcessor<Data> processor= new BatchEventProcessor<Data>(disruptor.getRingBuffer(), sequenceBarrier, handle2);// disruptor.handleEventsWith(processor); //处理器1处理完,扔给处理器2处理(2) SequenceBarrier sequenceBarrier=disruptor.handleEventsWith(handle1).asSequenceBarrier(); disruptor.after(handle1).handleEventsWith(handle2); RingBuffer<Data> ringBuffer=disruptor.start();; for(int i=0;i<10;i++){ long sequence=ringBuffer.next(); Data data=ringBuffer.get(sequence); data.setId("0"+i); data.setAge("222"); data.setName("333"); ringBuffer.publish(sequence); } }
简单封装:
public class DisruptorTest { //数据类,维护一个Ringbuffer,并有返回Ringbuffer实例对象的方法 DataRingBuffer dataRing = new DataRingBuffer(); //获取一个Ringbuffer实例 RingBuffer<Data> ringBuffer = dataRing.getRingBuffer(); //消费者与RingBuffer之间的桥梁 SequenceBarrier newBarrier = ringBuffer.newBarrier(); //数据处理 自定义处理逻辑 EventHandler<Data> handle = new DataHandle(); //final DataProvider<T> dataProvider,RingBuffer实现了接口(EventSequencer) //final SequenceBarrier sequenceBarrier, //事件处理器 //final EventHandler<? super T> eventHandler) BatchEventProcessor<Data> processor = new BatchEventProcessor<Data>(ringBuffer, newBarrier, handle); @Before public void init() { //添加特定的顺序控制 安全并自动添加到序列清单 ringBuffer.addGatingSequences(processor.getSequence()); //创建线程池 ExecutorService管理线程,并提供停止方法 ExecutorService threadPool = Executors.newCachedThreadPool(); //提交任务 实现runable接口 threadPool.submit(processor); } @Test public void test() throws Exception { for (int i = 0; i < 100; i++) { Thread.sleep(1000); Data data =new Data(); data.setAge("444"); data.setId("{"+i+"}"); dataRing.publish(data); } } }
阅读全文
0 0
- disruptor学习
- Disruptor学习总结(二):Disruptor分析
- Disruptor学习----综述
- disruptor学习笔记
- Disruptor学习地址
- Disruptor
- disruptor
- disruptor
- disruptor
- disruptor
- disruptor
- Disruptor
- Disruptor
- Disruptor
- Disruptor
- Disruptor
- Disruptor
- Disruptor
- jvm优化—— 图解垃圾回收
- Servlet监听器
- jquery mobile 中button去掉点击时候的阴影
- 在VMware虚拟机下安装Android Studio(AS)以及运行第一个HelloWorld程序
- 获取scrollTop兼容各浏览器的方法,以及body和documentElement是啥?
- disruptor学习
- day1
- 客户信息管理系统6—客户信息的删除(二)
- CUDA优化知识点
- JDBC用ConnectionFactory创建数据库连接
- 任学堂说科技:穿越计算机迷雾,从零开始构建计算机
- mybatis反向生成实体和xml、mapper接口
- tt
- 【HNOI2010】弹飞绵羊 分块/LCT