有事没事领个红包

disruptor 单生产者多消费者

demo1 单生产者多消费者创建。

maven 依赖

<!-- https://mvnrepository.com/artifact/com.lmax/disruptor -->
        <dependency>
            <groupId>com.lmax</groupId>
            <artifactId>disruptor</artifactId>
            <version>3.4.2</version>
        </dependency>

 

1 对象 - Message

复制代码
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class Message2 {
    private String id;
    private String name;
    private double price;
}
复制代码

2 在主函数中创建 disruptor

复制代码
Disruptor<Message2> disruptor = new Disruptor<>(
                new EventFactory<Message2>() {
                    @Override
                    public Message2 newInstance() {
                        return new Message2();
                    }
                },
                1 << 10,
                Executors.defaultThreadFactory(),
                ProducerType.SINGLE,
                new BusySpinWaitStrategy()
        );
复制代码

 

3 disruptor 绑定消费者

复制代码
// disruptor 绑定消费者
disruptor.handleEventsWith(new MessageHandler1());


//创建消费者
@Slf4j
public class MessageHandler1 implements EventHandler<Message2> {
    @Override
    public void onEvent(Message2 event, long sequence, boolean endOfBatch) throws Exception {
        event.setId(UUID.randomUUID().toString());
        log.info("【handler1,set id】 id: {}, name: {}, price: {}", event.getId(), event.getName(), event.getPrice());
    }
}
复制代码

 

4 启动 disruptor

RingBuffer<Message2> ringBuffer = disruptor.start();

 

5 disruptor 绑定生产者

复制代码
//绑定生产者
CountDownLatch latch = new CountDownLatch(1);
ExecutorService es = Executors.newFixedThreadPool(4);
es.submit(new MessagePublish2(disruptor, latch));

// 生产者类
public class MessagePublish2 implements Runnable {
    private Disruptor<Message2> disruptor;
    private CountDownLatch latch;

    public MessagePublish2(Disruptor<Message2> disruptor, CountDownLatch latch) {
        this.disruptor = disruptor;
        this.latch = latch;
    }

    @Override
    public void run() {
        for (int i = 0; i < 3; i++) {
            disruptor.publishEvent(new MessageEventTranslator());
        }
        latch.countDown();
    }
}
复制代码

 

6 阻塞等待 & 关闭服务

        // 阻塞等待
        latch.await();

        // 关闭服务
        es.shutdown();
        disruptor.shutdown();

 

posted @   crazyCodeLove  阅读(1737)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示