如何手写一个消息队列

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

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();

    }

版权声明:本文为weixin_43933159原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。