如何手写一个消息队列

本文以通俗易懂的方式介绍了消息队列的基本概念,将其比喻为单向管子,生产者放入消息,消费者取出消息。提供了一个简单的Java实现,使用LinkedList作为数据结构,并通过wait/notify实现同步。代码中展示了生产者线程向队列添加消息,以及消费者线程从队列中取出并打印消息的过程。
摘要由CSDN通过智能技术生成

想要手写一个消息队列,我们首先要知道消息队列是一个什么东西,我们要做的事情是什么。
由于笔者要做的是一个面对小白的科普,就不用专业的术语去说明;消息队列实际上就是一个管子,不过这个管子是一个单向的,只能从一个方向去向管子内放东西,另一侧去拿东西,这样的一个管子,我们称之为,消息队列。
向管子内放东西的人称为生产者,他将生产的东西放到管子里面,同时这个管子只能串行的存放一行东西,接收方每次只能拿出来一个,这个接收方称位消费者。

static class MessageQueue{
        int capacity;
        LinkedList<Integer> list = new LinkedList<>();
        public MessageQueue(int capacity){
            this.capacity = capacity;
        }
        public int take() throws InterruptedException {
            synchronized (list){
                if(list.isEmpty()){
                    System.out.println("队列空了,取不出来,需要等待");
                    list.wait();
                }
                int res = list.removeFirst();
                list.notifyAll();
                return res;
            }
        }
        public void put(int message) throws InterruptedException {
            synchronized (list){
                if(capacity == list.size()){
                    System.out.println("队列满了,不能添加,需要等待");
                    list.wait();
                }
                list.add(message);
                list.notifyAll();
            }
        }
    }

下面是测试代码

public static void main(String[] args) {
        MessageQueue messageQueue = new MessageQueue(2);
        for(int i = 0;i < 3;i++){
            new Thread(()->{
                try {
                    messageQueue.put(2);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }).start();
        }
        new Thread(()->{
            while(true){
                try {
                    sleep(1000);
                    int cur = messageQueue.take();
                    System.out.println(cur);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

            }
        }).start();

    }
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值